KDB 支持的移位操作

Bit shift operation supported in KDB

我可以在 kdb 中执行移位操作吗? 例如我有一个值 256

  q)0b vs 256
  0000000000000000000000000000000000000000000000000000000100000000b

我只想使用位移运算乘以 2:

  0000000000000000000000000000000000000000000000000000001000000000b

kdb 支持吗? 此外,是否也支持 OR?

谢谢!

您可以使用prevnext来移位。例如,乘以 2 使用 next 然后转换回数字 0b sv:

0b sv next 0b vs 256
512

要移动超过 1 位,您可以使用 nextprev 和 over,或者使用 xprev:

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

在每种情况下,该位都被移动了 10 个位置。请注意,没有 xnext,负值必须与 xprev 一起使用。

包含 OR 可以通过在等长的布尔值列表上使用 any| 来实现,例如:

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

可以对不等于进行异或 (XOR) <>。在这个例子中有 3 个列表:

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

你可以使用 rotate function

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

编辑:如果 MSB 为 1 并向左旋转,则 rotate 将给出有趣的结果,反之亦然。示例:

q)1 rotate 1000b
0001b