c中的位操作使用&操作者

时间:2018-06-09 11:23:30

标签: c bit-manipulation

以下两行有什么区别:

x & ~(1<<n) //line 1
x & ~(~0<<n) //line 2

其中x和n是整数。上面的代码行找到x的最后n位。 例如:对于x = 107,n = 5第1行产生75作为输出,第2行产生11。

1 个答案:

答案 0 :(得分:1)

由于您未在问题中声明x的类型。假设它是signed integer类型。例如

int x = 107, n = 5; /* default type of int is signed */

案例1: - 如果x=107n=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=107n=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位?我不认为上面两行正在这样做。