Как работает C ++ поразрядно & quot; или & quot; операции над отрицательными числами?

Когда я даю переменной такое значение: e = 17|-15; Я получаю -15 в качестве ответа после компиляции. Я не могу понять, что использует арифметика с ++. Как он выполняет побитовую операцию ИЛИ на отрицательных десятичных дробях?

5

Решение

Он просто выполняет операцию над двоичными представлениями ваших чисел. В вашем случае это, кажется, дополнение двух.

 17 -> 00010001
-15 -> 11110001

Как видите, побитовый OR из этих двух чисел до сих пор -15,

В ваших комментариях выше вы указали, что пробовали это с представлениями дополнения двух, но вы, должно быть, сделали что-то не так. Вот шаг за шагом:

 15 ->  00001111      // 15 decimal is 00001111 binary
-15 -> ~00001111 + 1  // negation in two's complement is equvalent to ~x + 1
-15 ->  11110000 + 1  // do the complement
-15 ->  11110001      // add the 1
19

Другие решения

Он выполняет операции ИЛИ с отрицательными числами так же, как и с положительными числами. Числа почти наверняка представлены в виде дополнения до двух, что дает вам следующие значения:

17 = 0000000000010001
-15 = 1111111111110001

Как видите, все биты 17 уже установлены в -15, поэтому результат их объединения снова равен -15.

6

Побитовое или с отрицательным числом работает ПРОСТО как побитовое или с положительным числом. Биты в одном номере состоят из битов в другом номере. То, как ваш процессор представляет отрицательные числа, это другой вопрос. Большинство используют то, что называется «дополнением до двух», что по сути означает «инвертировать число и добавить 1».

Итак, если мы имеем, для простоты, 8-битные числа:

15 is            00001111
Inverted we get  11110000
Add one          11110001

17 is            00010001

Ored together    11110001
3

   17 = b00010001
-15 = b11110001 <--- 2s complement
| -15 = b11110001
3

Оператор | является «побитовым OR«оператор, означающий, что каждый бит в цели вычисляется как OR-комбинация соответствующих битов в двух операндах. Это означает, что немного в результате 1 если любой из двух битов в числах в тех же позициях 1, иначе 0,

Ясно, что результат зависит от двоичного представления чисел, которое снова зависит от платформы.

Почти все платформы используют Два дополнения, который можно представить как круг чисел без знака, в котором отрицательные числа находятся только в противоположном направлении, чем положительные числа, и «окружают» круг.

Целые числа без знака:

введите описание изображения здесь

Целые числа со знаком:

введите описание изображения здесь

Расчет вашего примера выглядит следующим образом.

 17:   00000000 00000000 00000000 00010001
-15:   11111111 11111111 11111111 11110001
------------------------------------------
-15:   11111111 11111111 11111111 11110001
2

Вы должны посмотреть, как работают биты

В основном, если любое число имеет 1 в конкретном месте, чем результат также будет иметь 1

-15       : 11110001 (two's complement)
17        : 00010001
-15 | 17  : 11110001

как видите, результат такой же, как -15

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector