#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. Как это сделать для отрицательных чисел
Нет способа сохранить исходное число (или его часть (на самом деле последние биты)), потому что сдвиг не инъективны Т.е. есть несколько разных чисел, которые после сдвига становятся одинаковыми.
3>>1 // = 1;
2>>1 // = 1;
Если у вас есть 1. Что вы собираетесь получить? 2 или 3
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
или похожий тип.
Когда вы сделали правый сдвиг на 2, вы потеряли последние 2 бита .. снова, когда вы оставили сдвиг, они были заменены на 00
Вы можете сделать это
оставить 2 бита как
bits_to_be_lost = n & ((0х1<<2) — 1)
тогда твой код
чтобы получить это должно быть
N<<2 | bits_to_be_lost