在当前的C ++标准草案中,左移位运算符的定义如下[expr.shift]:
的值
E1 << E2是唯一的值一致来E1×2^E2模2^N,其中N是结果的类型的宽度。
考虑int E1 = 2^31-1 = 2'147'483'647,E2 = 1并且int具有32位。再有就是数的无限数量一致,以 E1×2^E2 = 4'294'967'294模2^N = 2^32,即,所有的数字4'294'967'294 + k×2^32,其中k的任意整数。示例是4'294'967'294(k=0)或-2(k=-1)。
我不明白这些数字中的唯一值表示标准的含义。这是否意味着可以由结果数据类型表示的唯一值?然后,我假设结果定义为-2。这种解释正确吗?
在C ++ 20之前,定义是不同的,这种情况将导致未定义的行为。我想这个变化与负号整数的强制性2's补码表示有关。
实际上,现在不再E1需要非负数。因此,似乎将-1 << 1其定义为-2。那也对吗?
我有3个无符号字节分别来自电线.[byte1,byte2,byte3]
我需要将这些转换为带符号的32位,但我不太确定如何处理负值的签名.
我想把字节复制到int32中的高3字节,然后将所有内容移到右边,但我读到这可能有意想不到的行为.有没有更简单的方法来处理这个?
该表示使用了两个人的赞美.
int main()
{
int x = -2;
cout << (1<<x) << endl;
cout << (1<<-2) << endl;
}
Run Code Online (Sandbox Code Playgroud)
在这里(1<<x)打印1073741824(如何计算)
而(1<<-2)输出垃圾值。
为什么这两个返回不同的答案?
我很难理解正确的移位运算符。我了解左移,说我们没有
int n = 11; which is 1011
Run Code Online (Sandbox Code Playgroud)
现在,如果我们左移它n << 1
,结果是
int a = n << 1 ; so a = 10110; (simply add a 0 to the end)
Run Code Online (Sandbox Code Playgroud)
这很有意义
现在右移是我遇到的困难
int a = n >> 1
Run Code Online (Sandbox Code Playgroud)
我认为答案是01011(在前面加一个0),它又是1011,而不是101。我的问题是我们如何松开最后一位数字。
更新: 我这样做的原因可能是假设int是8位,在这种情况下,我们将有int8 n = 1011 =>这是00001011,所以当我们右移1时,它会超过8位int 1,因此最后一位被丢弃,它变成0000101吗?这种理解正确吗?
是否有将返回最大N位数的python 3函数?
例:
>>> print(largest_bitsize(8))
255
>>> print(largest_bitsize(16))
65535
Run Code Online (Sandbox Code Playgroud)