以下两行有什么区别:
x & ~(1<<n) //line 1
x & ~(~0<<n) //line 2
其中x和n是整数。上面的代码行找到x的最后n位。 例如:对于x = 107,n = 5第1行产生75作为输出,第2行产生11。
答案 0 :(得分:1)
由于您未在问题中声明x
的类型。假设它是signed
integer
类型。例如
int x = 107, n = 5; /* default type of int is signed */
案例1: - 如果x=107
和n=5
并且您正在执行x & ~(1<<n)
1 => 0000 0000 | 0000 0000 | 0000 0000 | 0000 0001
1<<5 => 0000 0000 | 0000 0000 | 0000 0000 | 0010 0000
MSB LSB
---------------------------------------------------------
~(1<<5) => 1111 1111 | 1111 1111 | 1111 1111 | 1101 1111
&
x => 0000 0000 | 0000 0000 | 0000 0000 | 0110 1011
---------------------------------------------------------
=> 0000 0000 | 0000 0000 | 0000 0000 | 0100 1011 => 64 + 8 + 2 + 1 => 75
---------------------------------------------------------
案例2:如果x=107
和n=5
并且您正在执行x & ~(~0<<n)
0 => 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000
~0 => 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111
~0 << 5 => 1111 1111 | 1111 1111 | 1111 1111 | 1110 0000
--------------------------------------------------------
MSB LSB
~(~0 <<5)=> 0000 0000 | 0000 0000 | 0000 0000 | 0001 1111
&
x => 0000 0000 | 0000 0000 | 0000 0000 | 0110 1011
--------------------------------------------------------
=> 0000 0000 | 0000 0000 | 0000 0000 | 0000 1011 => 8 + 2 + 1 =>11
--------------------------------------------------------
我假设你知道bitwise AND(&)
,按位赞美(~
)运算符。 &
的真值表如下。使用两个操作数执行任何按位&
时,请按照下面的真值表。
--------------
A B | A & B |
-------------|
0 0 | 0 |
0 1 | 0 |
1 0 | 0 |
1 1 | 1 |
最后你要告诉上面的代码行找到x的最后n位?我不认为上面两行正在这样做。