4

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

即 n = 4;

xxxx1001 == xxxx1001(x 不在乎)

即 n = 2; xxxxxx01 == xxxxxx01

想不出不使用面具的好方法,=)。

4

7 回答 7

25

根据位数创建掩码:

int mask = (1 << bits) - 1;

然后你用它来比较值:

if ((a & mask) == (b & mask))
于 2009-09-13T11:40:56.950 回答
9

如果您真的不想使用掩码(并不是说这有什么问题!),那么您可以使用左移运算符:

if( a << m == b << m )
{
}

其中 m 是总位数减去您感兴趣的数字。也就是说,在问题的示例中,m 是 4(即 8 - 4)。

编辑:要清楚 - 我假设问题指示了一个 8 位整数给定使用的格式(例如,xxxx1001),但解决方案是通用的,因为它适用于任何大小的整数。要确定整数中的位数,请使用 8*sizeof(type),其中 type 可能是 int、short、long 等。

于 2009-09-13T11:46:04.490 回答
4

我认为需要做的是对这些值进行异或,然后使用掩码。例如,

(a ^ b) & (( 1<<n ) - 1)
于 2009-09-13T11:41:16.047 回答
2

尝试这个:

诠释我;
int theSame = 1;
对于 (i = 0; i < n; i++)
{
    如果 !(a >> i & 1) || !(b >> i & 1)
    {
        相同 = 0;
        休息;
    }
}
于 2009-09-13T20:32:39.547 回答
0

您可以使用模运算符。例如 n = 4,你必须整数 x 和 y:

if((x%16) == (y%16)){ ....

希望这对您有所帮助。

缺口

于 2009-09-13T11:40:55.577 回答
0

口罩有什么问题?

(a & 0x1111) == (b & 0x1111)
于 2009-09-13T11:41:02.833 回答
0

我会假设 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) 。

于 2012-06-29T00:03:16.407 回答