C - 需要比较int的n
最低位是否相等。
即。 n = 4;
xxxx1001 == xxxx1001(x无所谓)
即。 n = 2; xxxxxx01 == xxxxxx01
如果不使用蒙版,可以想出一个很好的方法,=)。
答案 0 :(得分:25)
根据位数创建掩码:
int mask = (1 << bits) - 1;
然后用它来比较值:
if ((a & mask) == (b & mask))
答案 1 :(得分:9)
如果你真的不想使用面具(不是说它有什么问题!),那么你可以使用shift-left操作符:
if( a << m == b << m )
{
}
其中m是总的位数减去你感兴趣的数字。也就是说,在问题的例子中,m是4(即8 - 4)。
编辑:要清楚 - 我假设问题表明给定使用的格式为8位整数(例如,xxxx1001),但解决方案是通用的,因为它适合任何大小的整数。要确定整数中的位数,请使用8 * sizeof(type),其中type可以是int,short,long等。
答案 2 :(得分:4)
我认为需要做的是xor值然后使用掩码。 例如,
(a ^ b) & (( 1<<n ) - 1)
答案 3 :(得分:2)
试试这个:
int i; int theSame = 1; for (i = 0; i < n; i++) { if !(a >> i & 1) || !(b >> i & 1) { theSame = 0; break; } }
答案 4 :(得分:0)
你可以使用模运算符。例如,n = 4,你必须整理x和y:
if((x%16) == (y%16)){ ....
希望这会对你有所帮助。
尼克
答案 5 :(得分:0)
面具有什么问题?
(a & 0x1111) == (b & 0x1111)
答案 6 :(得分:0)
我认为4个低位等于
首先使用y =(a ^ b)来获得该位模式(x表示未知)
xxxx0000
然后用y = ~y
反转位模式xxxx1111
然后用y ^ =(y + 1)
检测第一个0xxx11111
然后向右移动n次&gt;&gt; = n
0000xxx1
如果它是非零,那么最低的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)。 />