比较两个数字的最高位:==,<,< =

时间:2017-06-08 10:32:54

标签: bit-manipulation

是否有快速位操作来实现msb_equal:一个函数来检查两个数字是否具有相同的最高位?

例如,0b0001000b000111都有4个作为最高有效位值,因此它们最多为msb_equal。相比之下,0b001111的MSB值为8,而0b010000的MSB值为16,因此该对 msb_equal

同样,是否有快速计算<和< =?

的方法

示例:

msb_equal(0, 0) => true
msb_equal(2, 3) => true

msb_equal(0, 1) => false
msb_equal(1, 2) => false
msb_equal(3, 4) => false

msb_equal(128, 255) => true

评论询问为什么0和1不是msb_equal。我对此的看法是,如果我用二进制写出两个数字,当每个数字中最重要的1位是相同的位时,它们是msb_equal。

写出2& 3:

2 == b0010
3 == b0011

在这种情况下,每个数字中最顶部的1是相同的

写出1& 0:

1 == b0001
0 == b0000

这里,最顶层的1不一样。

可以说,由于0没有最高设置位,msb_equal(0,0)是不明确的。我将其定义为true:我认为这是有用且一致的。

1 个答案:

答案 0 :(得分:2)

是的,有基于快速位的操作来计算MSB相等和不等式。

关于语法

的注释

我将为按位和逻辑运算符提供使用c语言语法的实现:

  • | - 按位OR。 || - 逻辑或。
  • & - 按位AND。 && - 逻辑AND。
  • ^ - 按位异或。

==

msb_equal(l, r) -> bool
{
  return (l^r) <= (l&r)
}

<

这取自Z Order Curve上的维基百科页面( awesome ):

msb_less_than(l, r) -> bool
{
  (l < r) && (l < l^r)
}

<=

msb_less_than_equal(l, r) -> bool
{
  (l < r) || (l^r <= l&r)
}