Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобрезование BitArray в byte и обратно (C#), BitArray->byte, byte->BitArray 
V
    Опции темы
andrexus
Дата 12.4.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.12.2005

Репутация: нет
Всего: нет



Допустим есть некоторое число, представленное объектом BitArray. Каким образом можно получить десятичное представление этого числа? Например тип byte. Затем необходимо провести обратную операцию: преобразовать байт в четырехбитовое число BitArray.
PM MAIL   Вверх
Freak_FB
Дата 13.4.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



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

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

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;
}




--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
marcusmae
Дата 13.4.2008, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



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 - получится тройка.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Freak_FB
  Дата 13.4.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



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

Это сообщение отредактировал(а) Freak_FB - 13.4.2008, 17:42


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
marcusmae
Дата 13.4.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



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


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Freak_FB
Дата 13.4.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



Код:
Код

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 мс


Это сообщение отредактировал(а) Freak_FB - 13.4.2008, 20:03


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
mr.DUDA
Дата 13.4.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232




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



--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0785 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.