Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

~x | x, где x = 1 компилятор выдаёт -1, а вручную получаю -3. Как это правильно посчитать?

ПрограммированиеКомпьютерная грамотность+3
Галанин Сергей
  · 656
< Frontend-разработчик /> "Это не похоже на настоящее описание" - сказал мне валидатор...  · 15 нояб 2020

Очень странно, что Вы получаете -3 вручную :)

Смотрите:

1 в двоичном представлении с учетом 32 бит превращается в 0..0 * 31 + 1, т.е. 31 нуль (ноль, неважно) и одну единицу.

Далее Вы делаете побитовое отрицание (~), то есть мы меняем все 0 на 1 и наоборот. Получили 31 единицу и один ноль. 1..1 * 31 + 0.

-------------------------

На самом деле этот шаг не нужен, но для общего развития - отрицательные числа в двоичной системе получаются путем побитового отрицания исходного числа и прибавлением единицы в двоичной системе. Следовательно, мы можем узнать, что за число ~x, если сделаем наоборот - отнимем единицу и потом обратим биты:

1..1 * 30 + 01

0..0 * 30 + 10 = 2 => значит ~x = -2 при x = 1

-------------------------

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

Т.к. Вы берете 1..1 * 31 + 0 и 0..0 * 31 + 1, то у Вас все 32 бита - единицы получаются.

Ну и дальше делаем как уже выше написано: отнимаем единицу и обращаем биты:

1..1 * 32 => 1..1 * 31 + 0 => 0..0 * 31 + 1 = 1 => следовательно, само число ~x | x = -1

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