Почему моя переменная не изменилась после применения к ней оператора сдвига битов? - PullRequest
7 голосов
/ 16 июня 2011
int main()
{
    int i=3;
    (i << 1);
    cout << i; //Prints 3
}

Я ожидал получить 6 из-за сдвига влево на один бит. Почему не работает?

Ответы [ 7 ]

19 голосов
/ 16 июня 2011

Поскольку операторы сдвига битов возвращают значение.

Вы хотите это:

#include <iostream>

int main()
{
     int i = 3;
     i = i << 1;
     std::cout << i;
}

Операторы сдвига не сдвигаются "на месте".Возможно, вы думаете о другой версии.Если бы они это сделали, как и многие другие бинарные операторы C ++, у нас случились бы очень плохие вещи.

i <<= 1; 

int a = 3;
int b = 2;
a + b;    // value thrown away
a << b;   // same as above
10 голосов
/ 16 июня 2011

Вы должны использовать <<= или значение просто потеряно.

4 голосов
/ 16 июня 2011

Вам необходимо присвоить i смещенному значению.

int main()
{
    int i=3;
    i <<= 1;
    cout << i; //Prints 3
}

В качестве альтернативы вы можете использовать << = в качестве оператора присваивания: </p>

i <<= 1;
3 голосов
/ 16 июня 2011

Вы не присваиваете значение выражения (i << 1); обратно i.

Попробуйте:

i = i << 1;

Или (то же самое):

i <<= 1;
3 голосов
/ 16 июня 2011

Поскольку вы не прислали ответ обратно i.

i = i << 1;
2 голосов
/ 16 июня 2011

Причина: i << 1 создает промежуточное значение, которое не сохраняется обратно в переменную i.

// i is initially in memory
int i=3;

// load i into register and perform shift operation,
// but the value in memory is NOT changed
(i << 1);

// 1. load i into register and perform shift operation
// 2. write back to memory so now i has the new value
i = i << 1;

Для вашего намерения вы можете использовать:

// equal to i = i << 1
i <<= 1;
2 голосов
/ 16 июня 2011

Вам необходимо переназначить значение обратно на i с помощью i<<=1 (используя «оператор сдвига влево и назначения»)

...