int n = 500;
unsigned int max = n>>4;
cout << max;
它打印出31。
它对500做了什么才能得到31?
位移操作!
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(因为从我的头脑中涌出的话语会导致无效的胡言乱语,这些人表述得比我清楚)
使用 << 进行左移会导致从最低有效端(右侧)移动0,并导致从最高有效端(左侧)掉落位。
使用 >> 进行右移会导致从最高有效端(左侧)移动0,并导致位从最低有效端(右侧)掉落,如果数字是无符号的。
位移不会改变被移位的变量的值。 相反,将创建一个具有位移结果的临时值。
500被向右移位了4次。
x >> y
在数学上表示为x / 2^y
。
因此500 / 2^4
等于500 / 16
。在整数除法中,结果为31
。
它使用整数除法将500除以16。
>>
是一个右移操作符,它将n
的二进制表示向右移动4次。这相当于将n
除以2的4次方,即除以2^4=16。这是整数除法,因此小数部分被截断了。
它将500的二进制位向右移动4位,同时丢弃最右边的位。
500 = 111110100 (二进制)
111110100 >> 4 = 11111 = 31
500的二进制表示为[1 1111 0100]
(4 + 16 + 32 + 64 + 128 + 256)
将其向右移动4位,你会失去最低的4位,结果为:
[1 1111]
即为1 + 2 + 4 + 8 + 16 = 31
你也可以用十六进制来查看它:
500
(十进制)等于0x1F4
(十六进制)。
然后向右移动4位,或者一个nibble:
0x1F
等于31
(十进制)。
111110100是二进制中的500。将位向右移动,你会得到11111,这是二进制中的31。
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;
}
>> 和 << 运算符是位移运算符。
http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/cxx_crib/shift.html
当然,它们可能会被过载以让你更加困惑!
500
是有符号的!500U
是无符号的。 - MSalters