<<操作员在下面的行中工作

How does the << operator works in the following line

本文关键字:lt 工作 在下面 操作员      更新时间:2023-10-16

我遇到了一行代码。

int m_iCorners = 30 , m_iTesselation2 = 10;
int iNeededSize = (4 + (m_iCorners + 1) * (m_iTesselation2 << 1));

<<运算符在上述代码中的作用是什么?它如何影响m_iTesselation2值?

<<是左移运算符。它将数字的位向左移位运算符右侧给定的数字。示例:

// Showing only 8 bits here for simplicity (int is 32 bits wide).
int x = 10;    // bits: 0000 1010
int y = x << 1 // bits: 0001 0100 (bits shifted by 1 to the left)
y = x << 2;    // bits: 0010 1000 (bits shifted by 2 to the left)

int向左移动31是未定义的行为。看见https://godbolt.org/z/8ShJ9u

y = x << 31; // !!( THIS IS UB, thanks @Ted Lyngmo)
y = x >> 31; // This is fine, y will be 0

请注意,x本身在这里没有变化,创建了一个临时值,并将该值分配给y,与执行y = x + 2时相同。

左移通常是将任何东西乘以2的快速方法。移位1位导致CCD_ 9。移位2比特相当于CCD_ 10。

<<>>是移位运算符。它们将第一个操作数的值按第二个操作数指定的位数向左/向右移动。

<<

让我们看看它是如何为13 << 3工作的。

CCD_ 15的二进制表示是CCD_。在计算机中,值存储在固定数量的位上,具体取决于它的类型。假设它存储在程序中的2个字节中。

这就是1313 << 3在2个字节上的表示方式:

0000 0000  0000 1101            <--- 13
000 0000 0000  0110 1000            <--- 13 << 3
^^^                  ^^^
|                    +----- 3 new bits
+----- these bits are lost

CCD_ 19的比特被向左移位3个位置。原始值最左边的3位丢失。右侧插入三个0位。

总之,a << b的值是(a * 2^b) mod 256^n,其中n是用于表示a的值的字节数。左移的作用与值为2的幂的乘积相同。

>>

右移(>>(类似。比特被移到右边,最右边的比特被丢失,新的比特被插入左边。在左侧插入的位取决于最左边操作数的符号。如果第一个操作数的值为负数,则右移将1插入到左边;否则插入CCD_ 28
此行为生成的值与第一个操作数具有相同的符号。

右移的作用是将整数除以2的幂。a >> b的值为(a / 2^b)

重要

整数提升首先应用于两个操作数。在本例中,13被处理为int,在当今大多数架构中,这意味着它用4个字节表示,即使1个字节足以存储它

如果要移位的位数为负数或大于提升后第一个操作数的位数,则<<>>的行为都是未定义的。

阅读更多关于轮班操作员的信息。

m_iTesselation2的值为10,即二进制的0000 1010。当你左移1,即二进制的0000 0001时,它会按照以下语法将一位移到10:

int iNeededSize = ... (m_iTesselation2 << 1);

这样就得到了相当于十进制20的0001 0100