钻头检查数字是否在特定范围内

Ast*_*oth 11 c c++ algorithm bit-manipulation

我在"source\common\unicode\utf.h"ICU库(International Components for Unicode)的文件中发现了一个有趣的小问题.钻头用于检查数字是否在特定范围内.

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

我已经想出了幻数(0xfffffc00)来自:

MagicNumber = 0xffffffff - (HighBound - LowBound)
Run Code Online (Sandbox Code Playgroud)

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

还有另外一点是为了检查一个数字是否在特定范围内吗?

Rol*_*lig 12

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

0xD800 == 0b1101_1000_0000_0000
0xDBFF == 0b1101_1011_1111_1111
Run Code Online (Sandbox Code Playgroud)

这个测试真正做的是掩盖低十位.这通常写成

onlyHighBits = x & ~0x03FF
Run Code Online (Sandbox Code Playgroud)

在此操作之后("而不是"),低十位onlyHighBits保证为零.这意味着如果此数字等于现在的间隔的较低范围,则它已经在之前的间隔中的某个位置.

这个技巧适用于所有情况,其中间隔的下限和上限以二进制相同的数字开始,并且在某些时候,下限只有零,而上限只有1.在你的例子中,这是从右边的第十个位置.

  • 请注意,'a&b == c`并不意味着您可能认为它意味着什么(它意味着`a&(b == c)`).`a&〜b`在词汇上与'a&〜b`完全相同,我同意后者是一个更好的转录,只是因为它是通常的方式. (3认同)