C - 需要比较n
int 的最低位是否相等。
即 n = 4;
xxxx1001 == xxxx1001(x 不在乎)
即 n = 2; xxxxxx01 == xxxxxx01
想不出不使用面具的好方法,=)。
C - 需要比较n
int 的最低位是否相等。
即 n = 4;
xxxx1001 == xxxx1001(x 不在乎)
即 n = 2; xxxxxx01 == xxxxxx01
想不出不使用面具的好方法,=)。
根据位数创建掩码:
int mask = (1 << bits) - 1;
然后你用它来比较值:
if ((a & mask) == (b & mask))
如果您真的不想使用掩码(并不是说这有什么问题!),那么您可以使用左移运算符:
if( a << m == b << m )
{
}
其中 m 是总位数减去您感兴趣的数字。也就是说,在问题的示例中,m 是 4(即 8 - 4)。
编辑:要清楚 - 我假设问题指示了一个 8 位整数给定使用的格式(例如,xxxx1001),但解决方案是通用的,因为它适用于任何大小的整数。要确定整数中的位数,请使用 8*sizeof(type),其中 type 可能是 int、short、long 等。
我认为需要做的是对这些值进行异或,然后使用掩码。例如,
(a ^ b) & (( 1<<n ) - 1)
尝试这个:
诠释我; int theSame = 1; 对于 (i = 0; i < n; i++) { 如果 !(a >> i & 1) || !(b >> i & 1) { 相同 = 0; 休息; } }
您可以使用模运算符。例如 n = 4,你必须整数 x 和 y:
if((x%16) == (y%16)){ ....
希望这对您有所帮助。
缺口
口罩有什么问题?
(a & 0x1111) == (b & 0x1111)
我会假设 4 个低位等于
首先使用 y=(a^b) 来获得这个位模式(x 表示未知)
xxxx0000
然后用 y=~y 反转位模式
xxxx1111
然后用 y^=(y+1) 检测第一个 0
xxx11111
然后向右移动 n 次 y>>=n
0000xxx1
如果它不是 nul 则最低 n 位相等所以我的解决方案是
int are_lowest_n_bits_of_a_and_b_equals(int n,int a, int b)
/* return 0 if not equal, or non zero if equal */
{
int y=~(a^b);
return (y^(y+1))>>n;
}
由于有符号算术右移中的符号位传播,它似乎甚至对 n=number_of_bits(int) 也有效,但如果它是 UB,我们可以在这种边缘情况下简单地测试 (a==b) 。