Сдвиги битов в с ++ - PullRequest
       16

Сдвиги битов в с ++

5 голосов
/ 20 января 2011

Я не понимаю, почему это дает мне тот же ответ:

 long long a = 3265917058 >> 24;
 std::cout << a << std::endl; //194

 long long ip = 3265917058;
 long long b = ip >> 24;
 std::cout << b << std::endl; //194

, но это не так:

 long long a = (3265917058 << 16) >> 24;
 std::cout << a << std::endl; //240

 long long ip = 3265917058;
 long long b = (ip << 16) >> 24;
 std::cout << b << std::endl; //12757488 - **i want this to be 240 too!**

Обновление: я хочу 32-битный сдвиг, но как я могуя 32-битный сдвиг число, которое слишком велико для переменной INT?Обновление 2: Мой ответ - сделать неподписанный int ip.Тогда все будет хорошо.

Ответы [ 3 ]

7 голосов
/ 20 января 2011

Ваша буквальная константа 3265917058 является int. Добавьте суффикс LL, чтобы получить ожидаемое поведение (u) r:

long long a = (3265917058LL << 16) >> 24;
2 голосов
/ 20 января 2011

3265917058<<16 обе стороны int, поэтому операция будет выполняться в int (32 бита).

Вам нужно 3265917058LL<<16, тогда слева будет long long, и операция будет выполняться с этой шириной, то есть 64-битной.

1 голос
/ 20 января 2011

Чтобы получить то, что вы просите:

long long ip=3265917058;
long long b= (static_cast<unsigned int>(ip)<<16)>> 24;
std::cout<<b<<std::endl; // 240

Обратите внимание, что полученный вами результат (240) не является переносимым.Математически, результатом должно быть 12757488. Значение 240 связано с усечением, и это не гарантируется.Например, это не происходит в системах, где int равно 64 битам.

...