<<操作员在下面的行中工作
How does the << operator works in the following line
我遇到了一行代码。
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个字节中。
这就是13
和13 << 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
。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- 如何防止clang格式在流运算符调用之间添加换行符<<
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- (C 14)操作员&lt;&lt;超负荷无法正如智能指针向量所预期的那样工作
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串