我在 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/