Это простой двоичный формат. 0x2211
- это 16-разрядное целое число, где каждый бит представляет антенну:
format('%016b', 0x2211)
#=> "0010001000010001"
# ^ ^ ^ ^
# 14 10 5 1
Таким образом, чтобы выяснить, установлена ли антенна, вам просто нужно проверить, установлен ли соответствующий бит на 1
:
n = 0x2211
n[0] == 1 #=> true
n[1] == 1 #=> false
n[2] == 1 #=> false
n[3] == 1 #=> false
n[4] == 1 #=> true
Обратите внимание, что индексы основаны на 0, т. Е. n[0]
- это антенна 1.
Как получить значения 10,14 из шестнадцатеричных 11 и 1,5 значений из Hex 22 в Ruby?
Вы можете извлечь двоичный файл digits
, объединить each
цифру с индексом на основе 1 (with_index
), select
те биты, которые установлены на 1
и извлекают их индексы с помощью map
:
0x2211.digits(2) #=> [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1]
.each.with_index(1) #=> [[1, 1], [0, 2], [0, 3], [0, 4], [1, 5], [0, 6], [0, 7], [0, 8], [0, 9], [1, 10], [0, 11], [0, 12], [0, 13], [1, 14]]
.select { |b, i| b == 1 } #=> [[1, 1], [1, 5], [1, 10], [1, 14]]
.map(&:last) #=> [1, 5, 10, 14]
Или с использованием битовых операторов &
и <<
:
antennas = []
0.upto(15) { |i| antennas.push(i + 1) if (0x2211 & (1 << i)) != 0 }
antennas #=> [1, 5, 10, 14]