BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Как работают binary Assignment Operators?

Fiddle

Integral type - compound assignment operators

Попытался найти подробное описание с примеры, ничего толкового не нашел.

&= assigns the result of the logical AND.
|= assigns the result of the logical OR.
^= assigns the result of the logical XOR.
<<= assigns the result of the signed left bit shift.
>>= assigns the result of the signed right bit shift.
>>>= assigns the result of the unsigned right bit shift.

<<=
Shift the value of the first operand left the number of bits specified by the value of the second operand; store the result in the object specified by the first operand.
>>=
Shift the value of the first operand right the number of bits specified by the value of the second operand; store the result in the object specified by the first operand.
&=
Obtain the bitwise AND of the first and second operands; store the result in the object specified by the first operand.
^=
Obtain the bitwise exclusive OR of the first and second operands; store the result in the object specified by the first operand.
|=
Obtain the bitwise inclusive OR of the first and second operands; store the result in the object specified by the first operand.


Не понимаю какой результат ожидать от данных операторов.

К примеру для
int andA = 3;
  int andB = 555;
  andB = andB & andA;
  std::cout << andB;
  std::cout << '\n';

Результат 3, но если заменить 555 на 0 будет результат 0. Предположим что andB тогда принимает boolean, то есть если andA и andB от 1 и выше, результат должен быть 1 что есть true. Но нет, если 555 заменить на 2, результат будет 2 вместо ожидаемого мною 1. А если заменить andA на 25, то ответ будет 0. Хотя это положительно число и я ожидаю ответ 1 ведь andA и andB положительные.

Со сдвигом << если заменить shiftA более чем на 2, результат всегда 0, сдвиг на 0 овтет 5, сдвиг на -1 ответ 0.

orExA если выще orExВ плюсует значения, а если orExA меньше orExВ то вообще не понятно. К примеру выставил orExA на 4, овтет 1, предположим он показывает разницу между 5 и 4, ведь это 1. Ставлю orExA на 2, ожидаю получить 3, получаю 7, приплюсовало как если бы orExA был больше orExВ.

orInA предпологалось будет выбирать первое значение которое true, или то которое выше. Нет, если orInA = 6, ответ 7. Если orInA = 1, ответ 5. orInA = 5, ответ 5. orInA = 3, ответ 7, почему?

Вроде согласно описанию которое цитировал работает как я предпологаю, но нет, не понимаю их поведение, результаты совсем другие.
Возможно примеры плохие, буду благодарен за более наглядные.

UPD. Вот еще гуд експлейн https://www.geeksforgeeks.org/bitwise-operators-in...
  • Вопрос задан
  • 53 просмотра
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
Подробное описание и примеры в документации языка.
Операции &=, |= и ^= являются побитовыми, а не логическими. В твоих цитатах приведены ошибки описания.

Как работают побитовые операции.
5d788934b7918228570392.jpeg

andB & andA == 0b1000101011 & 0b0000000011 == 0b11 == 3


Побитовый сдвиг влево производит сдвиг бинарных разрядов в сторону старшего разряда.
0b00000011 << 1 == 0b00000110
0b00000011 << 4 == 0b00110000
0b11000000 << 2 == 0b0000001100000000 // or 0b00000000 for `uint8_t` type.


Побитовый сдвиг вправо - соответственно, производит сдвиг в сторону младшего разряда.
0b00110000 >> 1 == 0b00011000
0b00110000 >> 4 == 0b00000011
0b00001100 >> 3 == 0b00000001
Ответ написан
Zarom
@Zarom
Мастер на все руки из жопы
Честно, не понял ваших рассуждений. Кажется вы путаете бинарные и логические операции. Пока не переведёте все числа в двоичную систему счисления - ничего не поймёте.
Возьму первый ваш пример, пусть будет 25 >> 2. Для краткость оперировать буду 8-бит числами.
25 = 00011001
После сдвига на 2 в право:
00000110, т.е. 6 в десятичной.

Тоже самое влево на 2 даст 01100100 = 100.

А 25 & 3 =
00011001 &
00000011 =
00000001 = 1

25 | 3 =
00011001 |
00000011 =
00011011 = 27

Ну и тд, и тп.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
23 сент. 2019, в 14:03
10000 руб./за проект
23 сент. 2019, в 14:01
10000 руб./за проект
23 сент. 2019, в 13:46
2000 руб./за проект