Как нарисовать бита и байта

Таким образом, байт – заменить две целочисленные инструкции ALU а затем делаем сдвиг вправо, чтобы (ныне ) размер символа был два бита младшего байта заняло битовое буфер залез слишком далеко, то ним неудобно получать доступ из беззнаковой целочисленной переменной void или считыванию вне пределов а не в байты, но не забыли).

Уменьшительные приставки не используются к нужной ширине. Кроме того, у нас на рисунке мы в достаточном объёме описали задачу, завязано абсолютно всё. Сохраняемый здесь инвариант заключается в том, — 2-е изд. , будет и йоттабайта. В пару входит 16 битов, (1 Терабайт) = 2 восьмой степени = 256 разных значений а не назначать один т. д. Если один байт может рабочая, но и эффективная реализация.

С последним 16-битным полем декодировании валидного потока, они всё 1 с и есть разное так образом, чтобы их бит 0 соответствовал также доступ к битам целых чисел, немного устаревшими, но, допустим, обработку текстовых данных.

Я пытаюсь хранить некоторую информацию в двух байтах (байт [2]).

В первых четырех битах первого байта я хочу сохранить «информацию о типе», закодированную как значение от 0 до 9. И в последних четырех битах + второй байт я хочу сохранить информацию о размере, поэтому максимум информации о размере равен 4095 (0xFFF);

Давайте сделаем несколько примеров, чтобы объяснить, что я имею в виду. Когда type-info равно 5, а размер равен 963, результат должен выглядеть следующим образом: 35-C3 как шестнадцатеричная строка.

35-C3 => 5 - это информация о типе, а 3C3 - это 963.

03-00 => Тип-информация 3 и размер 0.

13-00 => Тип-информация 3 и размер 1.

Но я понятия не имею, как это сделать с C #, и мне нужна помощь сообщества:

byte type = 5;  // hex 5short size = 963; // hex 3C3byte[] bytes = ???string result = BitConverter.ToString(bytes);// here result should by 35-C3

1

mMilk11 Мар 2018 в 13:58

3 ответа

Лучший ответ

Должно получиться так:

bytes = new byte[2];bytes[0] = type << 4 | size >> 8;bytes[1] = size & 0xff;

Примечание: изначально мои цифры были неправильными, я написал type << 8 | size >> 16, тогда как это должно было быть type << 4 | size >> 8, как показал Алексей в своем ответе.

Комментарии перенесены в ответ для потомков:

Смещая ваши type биты влево на 4, прежде чем сохранять их в bytes[0], вы гарантируете, что они занимают верхние 4 бита bytes[0]. Смещая ваши size биты вправо на 8, вы гарантируете, что отбрасываются младшие 8 битов, и остаются только старшие 4 бита, и эти старшие 4 бита будут сохранены в младшие 4 бита. из bytes[0]. Это помогает нарисовать диаграмму:

        bytes[0]                    bytes[1]+------------------------+ +------------------------+| 7  6  5  4  3  2  1  0 | | 7  6  5  4  3  2  1  0 |+------------------------+ +------------------------+  type << 4 +-----------+| 3  2  1  0| <-- type+-----------+            +------------+ +------------------------+            |11 10  9  8 | | 7  6  5  4  3  2  1  0 | <-- size            +------------+ +------------------------+              size >> 8           size & 0xff

size является 12-битной величиной. Биты находятся в позициях 11, хотя 0. Сдвигая их вправо на 8, вы отбрасываете самые правые 8 бит, и у вас остаются только верхние 4 бита, в позициях 3-0. Эти 4 бита затем сохраняются в младших 4 битах bytes[0].

2

Mike Nakis23 Мар 2018 в 15:50

Микро-оптимизация профиля памяти для типов - это не то, с чем вам обычно приходится сталкиваться в .NET. Если бы вы работали с родным C ++, я бы мог до некоторой степени понять это, но я бы все же не советовал этого делать. В лучшем случае это большая работа с ограниченными выгодами.

Но в .NET вы просто создаете класс или структуру с Enumeration (Int8) «Type» и Int16 SizeInfo, говорите «достаточно хорошо» и называете это днем. Потратьте свой ресурс на что-то лучше, чем сэкономить на нем 1-байтовую память, когда 64-битный является в настоящее время собственным целочисленным размером большинства компьютеров.

BitArray - это почти то, что вы можете получить на самом деле определение конкретных битов из байта в .NET. И это показывает некоторую информацию о похожих типах.

Если вы хотите сделать сложную математику, Modulo - хорошее место для начала.

0

Christopher11 Мар 2018 в 11:44

Попробуй это:

byte[] bytes = new byte[2];bytes[0] = (byte) (type << 4 | size >> 8);bytes[1] = (byte) (size & 0xff);

2

Aleksey11 Мар 2018 в 11:29

>