Fefer_Ivan's blog

By Fefer_Ivan, 13 years ago, In Russian

Доброе утро/день/вечер, Codeforces.

*Предыдущий пост: http://mirror.codeforces.com/blog/entry/3853 *

Следуя совету al13n (http://mirror.codeforces.com/blog/entry/3853#comment-79329 ), для новой тонкости я создал новый пост, чтобы не возникало путаницы с комментариями.

20.02.12 Источник: от кого-то когда-то слышал, сейчас проверил, оказалось интересно
Оператор >> для знаковых типов сохраняет знак. То есть если вы сдвинете вправо отрицательное число, то слева будут дописаны 1, а если положительное — то 0. При сдвиге влево всегда дописывается 0. Меня это как-то не коснулось, потому что в задачах с битовыми масками размера больше 30 я всегда использовал unsigned long long.
Вот код, которым я это проверял:


#include <cstdio> using namespace std; inline void printBits(unsigned a){ for(int i = 31; i >= 0; --i) printf(((a >> i) & 1) ? "1" : "0"); puts(""); } template<class X> void testShift(X a){ printf("Before:\n"); printBits(a); a = (a << 1); printf("After:\n"); printBits(a); puts(""); } int main(){ printf("Signed 15\n"); testShift(15); printf("Signed -15\n"); testShift(-15); printf("Unsigned 15\n"); testShift(unsigned(15)); printf("Unsigned -15\n"); testShift(unsigned(-15)); return 0; }

http://ideone.com/Kc8fI

Продолжение следует...

  • Vote: I like it
  • +15
  • Vote: I do not like it