C++ C++;什么是>&燃气轮机;做

C++ C++;什么是>&燃气轮机;做,c++,integer,C++,Integer,>在这种情况下做什么 int n = 500; unsigned int max = n>>4; cout << max; int n=500; 无符号整数max=n>>4; cout和500的位右移了4次 x>>y在数学上表示x/2^y 因此500/2^4等于500/16。在整数除法中,结果是31它使用整数除法将500除以16 >是一个右移运算符,它将n的二进制表示的位右移4次。这相当于将n除以24倍,即。E除以2^4=16。这是整数除法,因此小数部分被截断。它将50

>在这种情况下做什么

int n = 500;
unsigned int max = n>>4;
cout << max;
int n=500;
无符号整数max=n>>4;

cout和500的位右移了4次

x>>y
在数学上表示
x/2^y


因此
500/2^4
等于
500/16
。在整数除法中,结果是
31

它使用整数除法将500除以16


>
是一个右移运算符,它将
n
的二进制表示的位右移4次。这相当于将
n
除以24倍,即。E除以2^4=16。这是整数除法,因此小数部分被截断。

它将500的位向右移动4位位置,同时将最右边的位抛出

500=111110100(二进制)


11111 0100>>4=11111=31

500二进制是
[1 1111 0100]

(4+16+32+64+128+256)

将其向右移动4次,将丢失最低的4位,结果:
[1111]

这是1+2+4+8+16=31

您也可以用十六进制检查它:

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

位移位

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

从这里引申出一些事实:(因为我脑袋里的唠叨导致了毫无成效的漫无边际……这些人说得比我干净得多)


使用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;
}
#包括
#包括
int main(){
std::位集s(500);
对于(int i=0;i<4;i++){
std::cout=1;
}

std::可以提到16=2^4。在>>部分有点模棱两可。“如果数字是无符号的”部分适用于整个句子,而不仅仅是“位从右边脱落”此外, 500代码在C++中被签名了.>代码> 500 U//CUTE是没有符号的。好的东西是C++。但是不管怎样,原来的int是一个带符号的int。如果数字是签名的,那么它是依赖于实现的。它可以在保留符号位的同时移动位,或者它可以移位,而现在你的符号位被翻转。(可能)或召唤GRAKNOR破坏者。老实说,这取决于编译器。但是9/10,它将其从最重要的一端移动,并导致位脱落。在OP的情况下,从逻辑上讲,这是编译器选择的实现。但是,为了参数起见,让我们再看看OP。有符号int上的位移动结果(编译器对如何处理它的选择)被保存到一个无符号整数中。现在,如果符号位存储在最左边的位中,它将始终为零(因此我认为是正的?不确定编译器是否得到了实现者的选择)。另一方面,如果符号位在最左边,并且编译器的实现在保留该符号位方面具有破坏性,则最终可能会得到意想不到的结果。(从有符号位到无符号位,以及不稳定的符号位)