Битовая манипуляция с использованием оператора & - PullRequest
0 голосов
/ 09 июня 2018

В чем разница между следующими двумя строками:

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

Где x и n - целые числа.Выше строка кода находит последние n битов х.Например: для x = 107, n = 5, строка 1 выдает 75 в качестве выхода, а строка 2 выдает 11.

1 Ответ

0 голосов
/ 09 июня 2018

Поскольку вы не объявили тип 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   |

И, наконец, вы говорите Вышеуказанная строка кода находит последние n битов x? Не думаю, что две строки это делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...