是否有快速位操作来实现msb_equal
:一个函数来检查两个数字是否具有相同的最高位?
例如,0b000100
和0b000111
都有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
:我认为这是有用且一致的。
答案 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)
}