Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
221 / 10 / 0
Регистрация: 04.11.2012
Сообщений: 62
1

Функция конвертации из Bitarray в Uint

05.05.2013, 12:40. Показов 2892. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Хотел бы попросить помощи в создании функции, которая конвертирует массив Бит в 4 байтное число, т.е. из Bitarray в Uint.
На входе у нас есть массив бит(32 штуки) на выходе значение типа uint, заранее спасибо....)

Добавлено через 44 минуты
Спасибо, за помощь)
Написал функцию на скорую руку вроде норм переводит, ео советую ей не пользоваться т.к. это "го..нокод"))
Если кто то напишет лучше рад буду посмотреть и поучится)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        // Перевод из bitarray в byte 
        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;
        }
 
        // Перевод из bitarray в uint
        private static uint BitArrayToUint(BitArray mas)
        {
            uint rez = 0;
            byte[] masb = new byte[4];
            BitArray mast = new BitArray(8);
            int j = 0,k = 0;
            for (int i = 0; i < 32; i++)
            {                
                mast[j] = mas[i];
                j++;
                if (j == 8)
                {
                    masb[k] = BitArrayToByte(mast);
                    k++;
                    j = 0;
                }
 
            }
            rez = BitConverter.ToUInt32(masb,0);
            return rez;
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2013, 12:40
Ответы с готовыми решениями:

Как без использования циклов перевести IList<uint> в uint[]
Добрый день! Не подскажите, как без использования циклов перевести IList&lt;uint&gt; в uint. К...

Error C2440: =: невозможно преобразовать "LRESULT (__cdecl *)(HWND,UINT,UINT,LONG)" в "WNDPROC"
MV Studio Express 2012. Для преобразования требуется reinterpret_cast, приведение в стиле С или...

ASSERT: "uint(i) < uint(size()" in file
Уважаемые коллеги! Пожалуйста, не пинайте сильно, я очень-очень начинающий программист ). Написал...

API функция для конвертации числа в Hex
Znaet li kto, est'li funkcii API dlja convertacii chisla v hex, standartnaja VB ne podkhodit...

2
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
06.05.2013, 08:58 2
Судя по виду функции Get в BitArray
C#
1
2
3
4
5
6
7
8
[__DynamicallyInvokable]
public bool Get(int index)
{
  if (index < 0 || index >= this.Length)
    throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
  else
    return (this.m_array[index / 32] & 1 << index % 32) != 0;
}
массив изначально хранится в виде массива int32[] (от младшего бита к старшему каждый) для экономии памяти. Поэтому, если вас не пугает рефлексия, достать значение можно так:
C#
1
2
3
4
5
6
7
        public static uint ToUint32(BitArray array)
        {
            if (array.Length != 32)
                throw new ArgumentException("Wrong array length.", "array");
 
            return (uint)(FInf.GetValue(array) as int[])[0];
        }
Если используется один и тот же массив, во избежание постоянного вызова GetValue, можно вынести получение ссылки на m_array в конструктор на основе этого массива.

Если вам обязательно нужно получить число с развернутым порядком бит (от старшего к младшему), можно взять алгоритмы реверсирования отсюда.

Добавлено через 1 час 34 минуты
Простите, забыл добавить самое главное:
C#
1
static readonly FieldInfo FInf = typeof(BitArray).GetField("m_array", BindingFlags.NonPublic | BindingFlags.Instance);
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.05.2013, 13:21 3
?..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections;
 
namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main()
        {
            var bit = new BitArray(32);
            bit[0] = bit[3] = bit[15] = true;
            uint u = BitArrayToUint(bit);
            Console.WriteLine(u);
            Console.ReadKey();
        }
 
        private static uint BitArrayToUint(BitArray bit)
        {
            uint result = 0;
            uint k = 1;
            foreach(bool b in bit)
            {
                if (b)
                    result |= k;
                k <<= 1;
            }
            return result;
 
        }
    }
}
0
06.05.2013, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2013, 13:21
Помогаю со студенческими работами здесь

Создать Таблицу конвертации для конвертации рублей России в разные валюты с учетом комиссии.
Помогите написать программу, пожалуйста Создать: “Таблица конвертации” для конвертации рублей...

Не работает функция конвертации "Фаренгейт -> Цельсий и Кельвин"
Всем привет! Не судите строго за вопрос, недавно начал учить язык. Данная программа должна...

BitArray. Целочисленная реализация.
Везде нахожу примеры как битовый массив хранится в строке. А мне нужно хранение в инте. Вопщем,...

Модернизация класса BitArray
Доброго времени суток. Кто работал с битовыми массивами, тот знает что такое етот клас и то что он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru