Мышление в C ++ операторы сдвига - PullRequest
2 голосов
/ 13 октября 2011

Я читаю книгу по стандартам C ++: «Мышление в C ++» Брюса Эккеля.

Многие функции C ++ очень хорошо объяснены в этой книге, но я кое-что подошел к кирпичной стене, и может ли это помочь или нет, когда я хочу запрограммировать игру, например, это раздражаетмне, как это работает, и я действительно не могу получить это из приведенного объяснения.

Мне было интересно, может ли кто-нибудь здесь помочь мне объяснить, как на самом деле работает этот пример программы:

printBinary.h -

void printBinary(const unsigned char val); 

printBinary.cpp -

#include <iostream>

void printBinary(const unsigned char val) {
    for (int i = 7; i >= 0; i--) {
        if (val & ( 1 << i)) 
            std::cout << "1";
        else 
            std::cout << "0"; 
    }
}

Bitwise.cpp -

#include "printBinary.h" 
#include <iostream> 

using namespace std; 

#define PR(STR, EXPR) \ 
cout << STR; printBinary(EXPR); cout << endl; 

int main() {

    unsigned int getval; 
    unsigned char a, b; 
    cout << "Enter a number between 0 and 255: ";
    cin >> getval; a = getval; 
    PR ("a in binary: ", a);
    cin >> getval; b = getval; 
    PR ("b in binary: ", b); 
    PR("a | b = ", a | b);

Эта программа должна объяснить мне, как работают битовые операторы сдвига (<<) и (>>), но я просто не понимаюЯ имею в виду, конечно, я знаю, как это работает, используя cin и cout, но я глуп, что не понимаю этого?

Эта часть, в частности, смущает меня больше, чем остальные:

if (val & ( 1 << i))

Спасибо за любую помощь

Ответы [ 4 ]

3 голосов
/ 13 октября 2011
if (val & ( 1 << i))

Рассмотрим следующее двоичное число (128):

10000000

& поразрядно "И" - 0 & 0 = 0, 0 & 1 = 1 & 0 = 0, 1 & 1 = 1.

<< - оператор побитового сдвига;сдвигает двоичное представление смещенного числа влево.

00000001 << 1 = 00000010;00000001 << 2 = 00000100.

Запишите его на листе бумаги во всех итерациях и посмотрите, что получится.

0 голосов
/ 13 октября 2011
if (val & ( 1 << i))

Проверяет, установлен ли бит в i-й позиции. (1 << i) - это что-то вроде 000001000 для i = 3. Теперь, если операция & возвращает ненулевое значение, это означает, что для val установлен соответствующий бит. </p>

0 голосов
/ 13 октября 2011

<< имеет два разных значения в показанном вами коде. </p>

if (val & (1 << i))

<< используется для сдвига битов, поэтому значение 1 будет сдвинуто влево на i битов </p>

cout << ....

Потоковый класс перегружает оператор <<, поэтому здесь он имеет другое значение, чем раньше. В этом случае << - это функция, которая выводит содержимое справа от cout </p>

0 голосов
/ 13 октября 2011
1 << i

принимает int -представление 1 и сдвигает его i бит влево.

val & x

является побитовым AND между val и x (где x в данном примере 1 << i).

if(x)

проверяет, является ли x, преобразованное в bool, истинным. Любое ненулевое значение целочисленного типа, преобразованное в bool, имеет значение true.

...