C ++ что делает >> - PullRequest
       2

C ++ что делает >>

3 голосов
/ 25 августа 2010

Что >> делает в этой ситуации?

int n = 500;
unsigned int max = n>>4;
cout << max;

Распечатывает 31 .

Что он сделал с 500 , чтобы получить 31 ?

Ответы [ 8 ]

9 голосов
/ 25 августа 2010

Бит сдвинут!

Исходный двоичный файл из 500:
111110100

Сдвиг 4
000011111, что составляет 31!

Original: 111110100
1st Shift:011111010
2nd Shift:001111101
3rd Shift:000111110
4th Shift:000011111 which equals 31.

Это эквивалентноделаю целочисленное деление на 16.

500/16 = 31
500/2 ^ 4 = 31

Некоторые факты взяты отсюда: http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BitOp/bitshift.html (потому что рявкает из моегоголова приводит к бессмысленному бродяжничеству ... эти люди утверждают, что это намного чище, чем я мог бы)

Сдвиг влево с использованием << приводит к смещению нулей от наименее значимого конца (с правой стороны) и к битамотвалиться от самого значительного конца (левая сторона).</p>

Сдвиг вправо с использованием >> приводит к смещению нулей от старшего значащего конца (левая сторона) и к падению битов с младшего значащего конца (правая сторона), если число не подписано.

Bitshifting не меняет значение смещаемой переменной.Вместо этого создается временное значение с результатом сдвига в битах.

4 голосов
/ 25 августа 2010

500 бит сдвинут вправо в 4 раза.

x >> y математически означает x / 2^y.

Следовательно 500 / 2^4, что равно 500 / 16.В целочисленном делении результат равен 31.

2 голосов
/ 25 августа 2010

111110100 - это 500 в двоичном формате. Переместите биты вправо, и у вас останется 11111, равное 31 в двоичном виде.

2 голосов
/ 25 августа 2010

500 в двоичном виде - [1 1111 0100]
(4 + 16 + 32 + 64 + 128 + 256)

Сдвиньте это вправо 4 раза, и вы потеряете самый низкий4 бита, в результате чего:
[1 1111]

, что составляет 1 + 2 + 4 + 8 + 16 = 31

Вы также можете просмотреть его в шестнадцатеричном формате:

500 (десятичный) равен 0x1F4 (шестнадцатеричный).
Затем сдвинуть вправо на 4 бита или на один клев:
0x1F == 31 (dec).

2 голосов
/ 25 августа 2010

Он сдвигает биты 500 вправо на 4 битные позиции, отбрасывая при этом самые правые биты.

500 = 111110100 (двоичный)

111110100 >> 4 =11111 = 31

2 голосов
/ 25 августа 2010

Он разделил 500 на 16 с использованием целочисленного деления.

>> - оператор сдвига вправо, который сдвигал биты двоичного представления n вправо 4 раза.Это эквивалентно делению n на 2 4 раза, т.е. делению его на 2 ^ 4 = 16.Это целочисленное деление, поэтому десятичная часть была усечена.

1 голос
/ 25 августа 2010

C ++ имеет хорошие классы для анимации что происходит на уровне битов

#include <bitset>
#include <iostream>

int main() {
    std::bitset<16> s(500);
    for(int i = 0; i < 4; i++) {
      std::cout << s << std::endl;
      s >>= 1;
    }

    std::cout << s
              << " (dec " << s.to_ulong() << ")"
              << std::endl;
}
1 голос
/ 25 августа 2010

Операторы >> и << являются операторами сдвига. </p>

http://www -numi.fnal.gov / offline_software / srt_public_context / WebDocs / Companion / cxx_crib / shift.html

Конечно, они могут быть перегружены, просто чтобы немного запутать вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...