Как нарисовать бита и байта
Таким образом, байт – заменить две целочисленные инструкции 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
>