是否有一个快速位操作要实现msb_equal
:一个函数来检查两个数字是否具有相同的最高有效位?
例如,0b000100
并且0b000111
两者都将 4 作为其最高有效位值,因此它们最多msb_equal
. 相比之下0b001111
,MSB 值为 8,MSB 值为0b010000
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
:我觉得这很有帮助且始终如一。
是的,有基于位的快速运算来计算 MSB 相等和不等式。
我将使用 c 语言语法为按位和逻辑运算符提供实现:
|
– 按位或。||
– 逻辑或。&
– 按位与。&&
– 逻辑与。^
– 按位异或。==
msb_equal(l, r) -> bool
{
return (l^r) <= (l&r)
}
<
这是从Z 阶曲线上的 Wikipedia 页面获取的(很棒):
msb_less_than(l, r) -> bool
{
(l < r) && (l < l^r)
}
<=
msb_less_than_equal(l, r) -> bool
{
(l < r) || (l^r <= l&r)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句