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

 #include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n=99;
int shift=n>>2;
cout<<shift;
shift=shift<<2;
cout<<shift;
}

Приведенный выше результат дает «unsignedShift = 24». Вопрос в том, если 24 дается, как я могу вернуть первоначальное значение, т.е. n 99. Когда я использую сдвиг влево, показывается ответ 96. Как это сделать для отрицательных чисел

1

Решение

Нет способа сохранить исходное число (или его часть (на самом деле последние биты)), потому что сдвиг не инъективны Т.е. есть несколько разных чисел, которые после сдвига становятся одинаковыми.

3>>1 // = 1;
2>>1 // = 1;

Если у вас есть 1. Что вы собираетесь получить? 2 или 3

2

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

Shfiting двоичное представленное число эффективно делится на 2.

Ты делаешь:

99 / 2 * 2 = 24.75 .75 часть не может быть в int типа так осталось с 24

24 * 2 * 2 = 96

В двоичном виде:

1100011 = 99

Сдвиг на два вправо:

0011000 = 24

Сдвиг на два влево:

1100000 = 96

Вы потеряли два младших бита, которые составили 3. Отсюда разница в результатах: 99 — 96 = 3.

Реальный вопрос здесь заключается в том, почему вы вообще делаете это — вы, вероятно, не хотите делать операции с битами. Для работы с действительными числами используйте double или похожий тип.

0

Когда вы сделали правый сдвиг на 2, вы потеряли последние 2 бита .. снова, когда вы оставили сдвиг, они были заменены на 00

Вы можете сделать это

оставить 2 бита как

bits_to_be_lost = n & ((0х1<<2) — 1)

тогда твой код

чтобы получить это должно быть

N<<2 | bits_to_be_lost

0
По вопросам рекламы [email protected]