我正在阅读一本关于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))
感谢您的帮助
答案 0 :(得分:3)
if (val & ( 1 << i))
考虑以下二进制数(128):
10000000
&
按位“与” - 0 & 0 = 0
,0 & 1 = 1 & 0 = 0
,1 & 1 = 1
。
<<
是按位移位运算符;它将移位数的二进制表示移到左边。
00000001 << 1 = 00000010
; 00000001 << 2 = 00000100
。
在所有迭代中将其写在一张纸上,看看会发生什么。
答案 1 :(得分:0)
1 << i
获取int
- 1
的表示形式,并将其i
位向左移动。
val & x
在AND
和val
之间有点x
(此示例中x
为1 << 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已设置相应的位。