Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Преобрезование BitArray в byte и обратно (C#)


Автор: andrexus 12.4.2008, 23:42
Допустим есть некоторое число, представленное объектом BitArray. Каким образом можно получить десятичное представление этого числа? Например тип byte. Затем необходимо провести обратную операцию: преобразовать байт в четырехбитовое число BitArray.

Автор: Freak_FB 13.4.2008, 00:56
Во-первых - в байте не четыре, а восемь бит, но это не суть важно.

С переведением байта в набор бит проблем нет:
Код

BitArray ba = new BitArray(new byte[] { 5 });

Байты будут расположены от младшего к старшему.

Перевести набор бит в байт придётся вручную, поскольку готового решения нет.
Мой вариант:
Код

private static byte BitArrayToByte(BitArray ba)
{
    byte result = 0;
    for (byte index = 0, m = 1; index < 8; index++, m *= 2)
        result += ba.Get(index) ? m : (byte)0;
    return result;
}


Автор: marcusmae 13.4.2008, 01:37
Freak_FB, проще через .CopyTo :

Код

            BitArray bitArray = new BitArray(new bool[] {
                true, true, false, false,
                false, false, false, false});
            byte[] b = new byte[1];
            bitArray.CopyTo(b, 0);


- слева направо : 1100 0000 - получится тройка.

Автор: Freak_FB 13.4.2008, 17:36
Прогнав тест (около миллиона раз), оказалось, что мой вариант, хоть и сложнее в написании, быстрее в три раза. smile 
Ни на что не претендую...

Автор: marcusmae 13.4.2008, 19:28
Freak_FB, а как время мерили и какого порядка величины получались - минуты, секунды, миллисекунды?..

Автор: Freak_FB 13.4.2008, 20:02
Код:
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Diagnostics;

namespace BitArrayTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int iterations = 10000000;

            BitArray ba = new BitArray(new byte[] { 134 });

            byte bb = 0;

            DateTime dt1, dt2;
            TimeSpan ts1, ts2;

            dt1 = DateTime.Now;
            for (int i = 0; i < iterations; i++)
                bb = MyBitArrayToByte(ba);
            dt2 = DateTime.Now;
            ts1 = dt2 - dt1;


            dt1 = DateTime.Now;
            for (int i = 0; i < iterations; i++)
                bb = HisBitArrayToByte(ba);
            dt2 = DateTime.Now;
            ts2 = dt2 - dt1;

            Console.WriteLine("Первый метод выполнялся {0} мс", ts1.TotalMilliseconds);
            Console.WriteLine("Второй метод выполнялся {0} мс", ts2.TotalMilliseconds);
            Console.WriteLine("{0} метод быстрее", (ts1 < ts2) ? "Первый" : "Второй");
            Console.ReadKey(true);
        }

        private static byte MyBitArrayToByte(BitArray ba)
        {
            byte result = 0;
            for (byte index = 0, m = 1; index < 8; index++, m *= 2)
                result += ba.Get(index) ? m : (byte)0;
            return result;
        }

        private static byte HisBitArrayToByte(BitArray ba)
        {
            byte[] b = new byte[1];
            ba.CopyTo(b, 0);
            return b[0];
        }
    }
}


Вывод:
Код

Первый метод выполнялся 1593,75 мс
Второй метод выполнялся 4250 мс

Автор: mr.DUDA 13.4.2008, 20:08

M
mr.DUDA
Вопрос темы можно считать решённым.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)