Какое техническое имя для этой побитовой операции? - PullRequest
0 голосов
/ 21 сентября 2018

Я конвертирую некоторую старую логику Visual Basic в базе данных Access в JavaScript.Есть функции, которые получают и устанавливают значение, которое - из-за отсутствия лучшего термина - в «побитовом» формате.Мне пришлось достать карандаш и немного бумаги, чтобы перепроектировать, что делают ответственные функции.

Каков технический термин для побитовой операции, которую я выполняю ниже? Пожалуйста, имейте в видучто общее количество слотов может быть больше (например, 15 вместо 6).

---All scheduling slots selected, decimal value = 126

Slot    Selected?   Formula
-----   ----------  ----------
1       1           0 + 2^1 = 2
2       1           2 + 2^2 = 6
3       1           6 + 2^3 = 14
4       1           14 + 2^4 = 30
5       1           30 + 2^5 = 62
6       1           62 + 2^6 = 126

 integer value = 126


--Custom scheduling slots selected, decimal value = 82

Slot    Selected?   Formula
-----   ----------  ----------
1       1           0 + 2^1 = 2
2       0
3       0
4       1           2 + 2^4 = 18
5       0
6       1           18 + 2^6 = 82

integer value = 82

1 Ответ

0 голосов
/ 18 мая 2019

Я думаю, они обычно называются BitFlags (хранение логических значений в виде отдельных битов в слове), это особый случай BitFields: для адресации произвольной ширины битов для различных значений.

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

Вместо того, чтобы вычислять числовое значение, оно более распространено длясоздать битовое поле, используя SHIFT и OR, и уничтожить их, используя SHIFT и AND - так как это более буквально, интуитивно (и быстрее);Числовое значение является лишь побочным эффектом интерпретации целого слова как целого числа.то есть:

// construct
x = 0;
// set bit 0
x |= true << 0;
// set bit 1
x |= false << 1;
// set bit 2
x |= true << 2;

x // 5

// destruct
x = 3
// get bit 0
!! (x >> 0 & 1); // true
// get bit 1
!! (x >> 1 & 1); // true
// get bit 2
!! (x >> 2 & 1); // false

Кроме того, если вы отправляете данные в неэффективном формате, например, в текстовом формате или в формате JSON через AJAX, вам нужно закодировать полученное число, чтобы максимизировать биты, упакованные в каждый символ ...использование x.toString(36) позволит вам хранить 5 бит (2 ^ 5 = 32) в одном символе (a-z0-9).Или вы можете выжать еще один бит, если используете String.fromCharCode(x + 32) - если вы посмотрите на таблицу ASCII, то вы можете использовать все печатные символы в диапазоне 32-127 = 95, что достаточно для значений 6 бит (2 ^6 = 64), но не 7 (2 ^ 7 = 128).Попытка использовать более 6 бит приведет к тому, что некоторые комбинации будут выводить многобайтовые символы UTF8, что, вероятно, не стоит затрат на кодирование (они будут отображаться как один символ, но на самом деле используют 2-4 байта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...