Операция сдвига битов поддерживается в KDB - PullRequest
0 голосов
/ 29 августа 2018

Могу ли я выполнить операции сдвига битов в kdb? Например, у меня есть значение 256

  q)0b vs 256
  0000000000000000000000000000000000000000000000000000000100000000b

Я хотел бы умножить на 2 только с помощью операций сдвига битов:

  0000000000000000000000000000000000000000000000000000001000000000b

KDB поддерживает это? Кроме того, ИЛИ также поддерживается?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете использовать rotate функция

q)0b sv   1 rotate 0b vs 256
512j

Отрицательное число переместит биты вправо, то есть разделит на 2:

q)0b sv   -1 rotate 0b vs 256
128j

Вращение битов 10 раз

q)0b sv   10 rotate 0b vs 1
1024j

РЕДАКТИРОВАТЬ : rotate даст забавные результаты, если MSB равен 1 и повернут влево или наоборот. Пример:

q)1 rotate 1000b
0001b
0 голосов
/ 29 августа 2018

Вы можете использовать prev и next для сдвига бита. Например, чтобы умножить на 2, используйте next, затем конвертируйте обратно в число с 0b sv:

0b sv next 0b vs 256
512

Чтобы сдвинуться более чем на 1 бит, вы можете использовать next или prev со значением over или использовать xprev:

q)0b sv next/[10;0b vs 256]
262144
q)0b sv -10 xprev 0b vs 256
262144

В каждом случае бит сдвигается на 10 позиций. Обратите внимание, что xnext отсутствует, отрицательное значение должно использоваться вместо xprev.

Включающее ИЛИ может быть достигнуто с помощью any или | в списках логических значений одинаковой длины, например:

0b sv any 0b vs/:256 512
768

Исключительно ИЛИ (XOR) можно сделать с неравными <>. В этом примере есть 3 списка:

(<>/)(0011b;0101b;1000b)
1110b
...