Разделить 32-битные байты на аналоги - PullRequest
0 голосов
/ 03 июня 2011

То, что я пытаюсь сделать, это разделить общее числовое значение байта 256 на их счетные части.

Мы знаем, что в двоичном виде:

0001 1111 is 31  
0011 1111 is 63  
0111 1111 is 127  
1111 1111 is 255

Цель -сделать так, чтобы, если у меня есть сетка 5 на 5

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0  

, что дает мне всего 25 слотов.Каждый слот может иметь числовое значение от 0 до 31.Поэтому числовое значение «4294967295» будет равно 31 в каждом слоте, где «0» равно 0 в каждом слоте, поэтому я пытаюсь выяснить, как в C # можно сдвигать битовые значения.

, поэтому, если яиметь в моей сетке:

1 3 0 0 0
0 0 0 0 0
0 0 5 0 0 
0 0 3 0 6  

Первый слот будет битом от 1 до 4, от 0x0 до 0x1F
Второй слот будет битом 5, от 0x20 до 0x3F
3-й слот будет битом 6, 0x40до 0x5F
4-й слот будет бит 7, от 0x60 до 0x7F
5-й слот будет бит 8, от 0x80 до 0x9F

и т. д.

Как бы это сделать в C #.

Было бы 0-31 на слот, (256/8) = всего 8 слотов.

Теоретически я мог бы иметь максимум 32 слота в сетке 6x5 или 5x6, если быМне было нужно.Но сейчас мне просто нужно 5x5.

- отредактировано

                    byte[] values = new byte[]
        {
            25, 31, 31, 31, 31,
            31, 31, 31, 31, 31,
            31, 31, 31, 31, 31,
            31, 31, 31, 31, 31,
            31, 31, 31, 31, 31,
            31, 31
        };
        Console.Clear();

        uint number = 0;
        for ( int i = 0; i < values.Length; i++ )
        {
            number |= (uint)(values[i] << i);
            Console.WriteLine( number );
        }

        byte[] buffer = BitConverter.GetBytes( number );

        for ( int i = 0; i < values.Length; i++ )
        {
            values[i] = (byte)((number >> i) & 0x1F);
        }

        Console.ReadLine();

Когда я сделал это, он дал мне 255, в буфере в каждом слоте, чтоЯ хотел ... Видимо, это то, к чему я стремлюсь.Даже если бы у меня было 8 дополнительных слотов, которые я мог бы использовать, но я просто проигнорирую их ...

Теперь следующая цель - разбить его на части из целого числа без знака.

Спасибо за всю помощь до сих пор в быстрой манере.

EDITED

Я изменил его обратно, по-видимому, я могу иметь только до 28 частей

Теперь у меня проблема с преобразованием обратно в их части.Сейчас он не сдвигается так, как мне бы хотелось, он устанавливает для них все 31, тогда как первый должен быть 25 в соответствии с массивом.

1 Ответ

1 голос
/ 03 июня 2011

Если каждый слот может иметь 0-31, то каждый слот нуждается в 5 битах. Вы можете поместить 6 слотов в 32-разрядное целое число, тогда вам понадобится одно целое число на строку.

Взгляните на Справочник операторов C # , особенно полезными для работы с битами являются |, &, <<, >>.

Первый слот будет от 1 до 4, от 0x0 до 0x1F

Второй слот будет бит 5, от 0x20 до 0x3F

3-й слот будет бит 6, от 0x40 до 0x5F

4-й слот будет бит 7, от 0x60 до 0x7F

5-й слот будет бит 8, от 0x80 до 0x9F

Это не так, как работают биты, вам нужна отдельная группа из 5 битов на слот. Если только один номер в каждой строке не является ненулевым, в этом случае вам нужно 3 бита, чтобы указать, какой слот имеет номер, и 5 бит для номера.

...