繁体   English   中英

C ++做什么做什么

[英]C++ what does >> do

>>在这种情况下做什么?

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从最高端(左侧)移位,并且如果数字是无符号的,则会导致位从最低端(右侧)脱落。

Bitshifting不会改变被移位变量的值。 而是使用位移结果创建临时值。

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

你也可以用Hex检查它:

500 (十进制)是0x1F4 (十六进制)。
然后转移到右边4位,或一个半字节
0x1F == 31 (十进制)。

111110100是二进制500。 将位向右移动,您将保留11111(二进制为31)。

>>和<<运营商正在转变运营商。

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

当然,他们可能会超载,只是为了让你更加困惑!

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM