Как объединить биты в большие целые числа в JavaScript

#javascript #bit-manipulation

#javascript #манипулирование битами

Вопрос:

Хотите знать, каков идеальный способ преобразования группы меньших битов в биты большего размера? Например, эти конкретные случаи:

  • от 3 8-битных чисел до 1 24-битного числа.
  • 2 16-битных числа в 1 32-битное число.

Интересно, какова общая методика, чтобы я мог применить ее к любому числу. Если это работает только для чисел, кратных 8, то это нормально, но в идеале это было бы в состоянии обрабатывать и эти случаи.

  • от 3 7-битных чисел до 1 21-битного числа.
  • от 9 3-разрядных чисел до 1 27-разрядного числа.

Я думал, что вы просто добавляете их, но, похоже, существует методика их сдвига, но я не уверен точно, как это работает в общем случае.

Комментарии:

1. Это во многом зависит от того, что означает «преобразование» в данном случае. (Это может быть почти что угодно.)

2. В основном я имею в виду обратное разбиению 24-битного числа на 3 8-битных числа, однако это может быть сделано.

Ответ №1:

Я предполагаю, что под «преобразованием» вы подразумеваете «объединение» битов.

Вот как вы могли бы сделать это с помощью shift:

 var int1 = 23; // "8 bit" number, stored in integer variable
var int2 = 67; // another one
var int3 = 189; // a third
var concatInt = ( int1 << 16 )   ( int2 << 8 )   int3;  

Здесь значение «concatInt» является побитовой конкатенацией 3 чисел [int1][int2][int3]

Конечно, вы можете делать это с любыми числами и любыми битами, при условии, что вы укладываетесь в 32-битное целое число.

Вот еще кое-что об этом:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

Комментарии:

1. Не уверен, работает ли это во всех случаях, описанных в сообщении, дайте мне знать, для каких это работает. Спасибо.

2. Я знаю о побитовых операторах, просто не знаю, как их использовать для подобных вещей.

3. Вы просто выполняете смещение на количество битов, которое вас интересует. Для вашей ситуации с 3 7 битами просто смещайте на 14 и 7 соответственно, вместо 16 и 8 в моем примере.

4. @user10869858 У вас это сработало? Или вы хотели бы более конкретные примеры в примере кода?