Как получить подписанное дополнение номера?
Я хочу найти значение числа со знаком в C. Поэтому, если у меня есть число, скажем, 10, в двоичном (в 8 битах) это будет 0000 0110. Как получить число со знаком в дополнении 1111 1110, которое это -2. Используя простые побитовые операции, сдвиги, маски, как мне сделать это преобразование? Я застрял на этом в течение нескольких часов.
2 ответа
Если у нас уже есть двоичное представление положительного числа n
то побитовое представление -n
является ~n+1
, другими словами, 1
плюс побитовое отрицание положительного числа.
http://en.wikipedia.org/wiki/Two%27s_complement
Я хочу найти значение числа со знаком в C. Поэтому, если у меня есть число, скажем, 10, в двоичном (в 8 битах) это будет 0000 0110. Как получить число со знаком в дополнении 1111 1110, которое это -2.
Вы в замешательстве. Дополнение 8-битового двоичного числа 0000 0110 составляет 1111 1010 (-10, если интерпретируется как подписанный, или 6, если интерпретируется как неподписанный). Все дело в том, что битовая комбинация и ее (беззнаковое) n-битное два дополняют до 2^n.
Используя простые побитовые операции, сдвиги, маски, как мне сделать это преобразование? Я застрял на этом в течение нескольких часов.
Вот:
unsigned char x = 0x0a;
unsigned char twos_complement = (~x) + 1;