相关疑难解决方法(0)

C ++ 20是否为“溢出”的有符号整数很好地定义了左移?

在当前的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。那也对吗?

c++ bit-shift language-lawyer c++20

11
推荐指数
1
解决办法
501
查看次数

在C++中从24位到32位的有符号扩展

我有3个无符号字节分别来自电线.[byte1,byte2,byte3]

我需要将这些转换为带符号的32位,但我不太确定如何处理负值的签名.

我想把字节复制到int32中的高3字节,然后将所有内容移到右边,但我读到这可能有意想不到的行为.有没有更简单的方法来处理这个?

该表示使用了两个人的赞美.

c++ bit-manipulation bit-shift sign-extension

4
推荐指数
1
解决办法
1844
查看次数

移位运算符如何在C ++中使用负数

int main() 
{
  int x = -2;

  cout << (1<<x) << endl;

  cout << (1<<-2) << endl;

}
Run Code Online (Sandbox Code Playgroud)

在这里(1<<x)打印1073741824(如何计算)

而(1<<-2)输出垃圾值。

为什么这两个返回不同的答案?

c++ bit-shift undefined-behavior

2
推荐指数
1
解决办法
125
查看次数

通过移位了解正确的移位运算符

我很难理解正确的移位运算符。我了解左移,说我们没有

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吗?这种理解正确吗?

c++ bit-shift

1
推荐指数
1
解决办法
163
查看次数

Python函数返回最大数目的64位

是否有将返回最大N位数的python 3函数?

例:

>>> print(largest_bitsize(8))
255
>>> print(largest_bitsize(16))
65535
Run Code Online (Sandbox Code Playgroud)

python math bit python-3.x

-4
推荐指数
5
解决办法
138
查看次数