用于检查数字是否在特定范围内的位

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

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

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

 MagicNumber = 0xffffffff - (HighBound - LowBound) 

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

是否有另外一点麻烦来检查一个数字是否在特定范围内?

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

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

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

 onlyHighBits = x & ~0x03FF 

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

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

如果您没有2 ^ x边界类型可能使用以下技巧:

如果x >= 0x < N ,则可以通过以下方式检查:

  if Longword( x ) < Longword( N ) then ... 

这是有效的,因为有符号数字中的负数对应于无符号数据类型中的最大数字。

您可以将此扩展(当范围检查为DISABLED时):

  if Longword( x - A ) < Longword ( ( B - A ) ) then ... 

现在你有两个测试(范围[ A, B > )在SUB和CMP加上一个Jcc,假设(B - A)是预先计算的。

我只在真正需要时才使用这些优化; 例如,它们往往会降低您的代码的可读性,并且每次测试只会缩短几个时钟周期。

C语言读者注意:Longword是Delphi的无符号32位数据类型。

只要您要查找的范围以2的幂的倍数开始(即,数字的二进制forms的低端的1位或更多位以0结尾)并且范围的大小为2,该公式就会起作用^ n-1(即低和高==低和低|高==高)。