Любой язык, который может выполнять сдвиг, может объединять числа с любым основанием. Хотя я являюсь поклонником различных способов / манипуляций, которые разные языки могут легко получить доступ к такого рода материалам, никогда не забывайте, что за всем этим стоит некоторая очень простая математика.
В этом случае двоичный код представляет собой простую степень 2, поэтому:
1 << 1 = 1
1 << 2 = 2
1 << 3 = 4
1 << 4 = 8
и так далее ...
если вы взяли двоичную строку: 10100101, вы можете легко преобразовать ее в байт следующим образом:
(1 << 7) + (0 << 6) + (1 << 5) + (0 << 4) + (0 << 3) + (1 << 2) + (0 << 1) + 1
Предполагая, что вы прошли и преобразовали каждое "0" или "1" в его числовой формат первым.
Это станет немного утомительным, если вы будете иметь дело с количеством битов, большим, чем 8 выше, но, поскольку вы делаете байт за раз, будет достаточно простого байтового массива на выбранном вами языке, что позволит вам выдвигать каждый байт в свою очередь.
Стоит также упомянуть, что этот же процесс может быть использован для других баз, и если у вас нет возможности смены, простое умножение обычно будет работать так же хорошо.
Если вы пометите столбцы сверху в двоичном виде, вы легко поймете, о чем я ... взяв приведенный выше пример (помните, что это все степени 2):
1 0 1 0 0 1 0 1
128 64 32 16 8 4 2 1 = 128 + 32 + 4 + 1 = 165
Не является частью вопроса, но связан ... и продвигается на один шаг вперед:
Шестнадцатеричное - это значения от 0 до F (16 значений), каждое из которых может вписаться в 4 бита ... так что
1010 0101 (8+2) (4+1) - Binary using powers of 2 only on 4 bits (8 4 2 1)
10 5 (Decimal) - (10 << 4) + 5 = 165
A 5 (Hexadecimal)