思考C ++移位运算符

时间:2011-10-13 12:07:02

标签: c++ bit-shift

我正在阅读一本关于C ++标准的书:Bruce Eckel撰写的“用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);

这个程序应该向我解释移位按位运算符(&lt;&lt;&lt;&lt;&lt;&lt;&gt;&gt;)是如何工作的但是我根本就没有得到它,我的意思是我确定我知道如何使用cin和cout,但我不理解这个是愚蠢的吗?

这件作品特别让我比其他人更困惑:

if (val & ( 1 << i))

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

if (val & ( 1 << i))

考虑以下二进制数(128):

10000000

&按位“与” - 0 & 0 = 00 & 1 = 1 & 0 = 01 & 1 = 1

<<是按位移位运算符;它将移位数的二进制表示移到左边。

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

在所有迭代中将其写在一张纸上,看看会发生什么。

答案 1 :(得分:0)

1 << i

获取int - 1的表示形式,并将其i位向左移动。

val & x

ANDval之间有点x(此示例中x1 << i)。

if(x)

测试转换为x的{​​{1}}是否为真。转换为bool的整数类型的任何非零值都为真。

答案 2 :(得分:0)

&LT;&LT;在您显示的代码中有两种不同的含义。

if (val & (1 << i))

&LT;&LT;用于比特移位,因此值1将向左移位i位

cout << ....

stream类重载了运算符&lt;&lt;,所以这里的含义与以前不同。 在这种情况下,&lt;&lt;是一个将右侧内容输出到cout的函数

答案 3 :(得分:0)

if (val & ( 1 << i))

检查是否设置了第i个位。对于i = 3,(1&lt; i&lt; i)类似于000001000。现在如果&amp; operation返回非零值,表示val已设置相应的位。