-(x)
отрицает x
.Отрицание в дополнении к двум - это то же самое, что и ~x+1
(bitflip + 1), как показано в приведенном ниже коде:
#include <stdio.h>
#include <stdio.h>
#include <stdint.h>
int prbits(uintmax_t X, int N /*how many bits to print (from the low end)*/)
{
int n=0;
uintmax_t shift=(uintmax_t)1<<(N-1);
for(;shift;n++,shift>>=1) putchar( (X&shift)?'1':'0');
return n;
}
int main()
{
prbits(0xA55A,16),puts("");
//1010010101011010
prbits(~0xA55A,16),puts("");
//0101101010100101
prbits(~0xA55A+1,16),puts("");
//0101101010100110
prbits(-0xA55A,16),puts("");
//0101101010100110 (same)
}
Когда вы разбиваете бит на значение с его битовым значением, вы получаете 0. Когда вы разбиваете бит на значениес его значением bitfliped + 1 (= его отрицательное значение) вы получаете первый ненулевой бит справа.
Почему?Если самый правый бит ~x
равен 1, добавление 1 к нему даст 0
с carry=1
.Вы повторяете это, в то время как самые правые биты равны 1 и обнуляют эти биты.Как только вы достигнете нуля (который будет 1
в x
, поскольку вы добавляете 1 к ~x
), он превращается в 1 с переносом == 0, поэтому сложение заканчивается.Справа у вас нули, слева у вас битфлипы.Вы удаляете это с оригиналом и получаете первый ненулевой бит справа.