Поскольку вы не объявили тип 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? Не думаю, что две строки это делают.