C - 需要比较int的“n”最低位是否相等

时间:2009-09-13 11:36:49

标签: c bit bit-manipulation

C - 需要比较int的n最低位是否相等。

即。 n = 4;

xxxx1001 == xxxx1001(x无所谓)

即。 n = 2; xxxxxx01 == xxxxxx01

如果不使用蒙版,可以想出一个很好的方法,=)。

7 个答案:

答案 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)

检测第一个0
xxx11111

然后向右移动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)。 />