Как получить подписанное дополнение номера?

Я хочу найти значение числа со знаком в 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;
Другие вопросы по тегам