c++ - 用于检查数字是否在特定范围内的位旋转

标签 c++ c algorithm bit-manipulation

我在 ICU 库(Unicode 的国际组件)的 "source\common\unicode\utf.h" 文件中发现了一些有趣的细节。 bit twiddling 用于检查数字是否在特定范围内。

// Is a code point in a range of U+d800..U+dbff?
#define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)

我已经弄清楚魔数(Magic Number) (0xfffffc00) 来自:

MagicNumber = 0xffffffff - (HighBound - LowBound)

但是,我还发现该公式并不适用于所有任意范围。这里有人知道公式在什么情况下有效吗?

检查数字是否在特定范围内是否还有其他麻烦?

最佳答案

要应用这些技巧,数字在其二进制表示中必须具有一些共同特征。

0xD800 == 0b1101_1000_0000_0000
0xDBFF == 0b1101_1011_1111_1111

这个测试真正做的是屏蔽掉低十位。这通常写成

onlyHighBits = x & ~0x03FF

在这个操作(“and not”)之后,onlyHighBits 的低十位保证为零。这意味着如果这个数字现在等于区间的下限,那么它就在之前区间的某个地方。

这个技巧适用于区间的下限和上限以相同的二进制数字开头的所有情况,并且在某些时候下限只有零而上限只有一个。在您的示例中,它位于右起第十个位置。

关于c++ - 用于检查数字是否在特定范围内的位旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573751/

相关文章:

算法设计。最佳,最有效的解决方案

c++ - false 和 FALSE 有什么区别?

c++ - Visual C++ 2005 中的新关键字和新指针类型。什么是托管 C++?

c - 编译我的 C 程序时发出警告(字符格式,不同类型的 arg)

c - GCC 将包含程序集的静态库插入到动态库中

更改函数以便它检索数组类型参数会导致错误 : FUNCTION DOES NOT EXIST

算法优化 : Logarithm by calculation or lookup table

树遍历算法

c++ - 定位因整数除法导致的数值错误

c++ - 为什么这段代码有不同的输出?