相关疑难解决方法(0)

C标准对于比特类型宽度的位移更多的比特说了些什么?

请考虑以下代码:

int i = 3 << 65;
Run Code Online (Sandbox Code Playgroud)

我希望结果是i==0,但实际结果是i==6.通过一些测试,我发现使用以下代码:

int i, s;
int a = i << s;
int b = i << (s & 31);
Run Code Online (Sandbox Code Playgroud)

ab始终是相同的.

C标准是否说过关于移位超过32位(类型的宽度int)的任何内容,还是这种未指定的行为?

c bit-shift

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

Java Integer左移的奇怪结果

我现在对java左移操作有点困惑,

1<<31 =  0x80000000  --> this I can understand
Run Code Online (Sandbox Code Playgroud)

1<<32 =  1       Why is this?
1<<33 =  2       
Run Code Online (Sandbox Code Playgroud)

看起来更多的移动值,采用模数32的值.

感谢大家的回复和JLS的报价.

我只想知道更多.知道它以这种方式设计的原因吗?或者只是一些惯例?显然C没有这个怪癖?

感谢@paxdiablo.看起来像C声明这个行为未定义.

我在这里有一些个人假设:

ARM体系结构参考手册A7.1.38

语法LSL Rd,Rm,#immed_5

哪里:

Rd 是存储操作结果的寄存器.

Rm是包含要移位的值的寄存器.

immed_5指定移位量,范围为0到31.

在指令级别,immedidate immed_5只需要5位就可以避免无意义的操作,从而节省一些指令空间.我想高级语言只是将这个约定统一起来,以避免在编译指令时产生无意义的努力.

java bit-manipulation bit-shift

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

意外的C/C++按位移位运算符结果

我想我会疯了.

我有一段代码需要创建一个(无符号)整数,其N后续位设置为1.确切地说,我有一个位掩码,在某些情况下,我想将它设置为一个实心的rnage.

我有以下功能:

void MaskAddRange(UINT& mask, UINT first, UINT count)
{
    mask |= ((1 << count) - 1) << first;
}
Run Code Online (Sandbox Code Playgroud)

简单来说:1 << count在二进制表示中100...000(零的数量是count),从这样的数字中减去1给出011...111,然后我们只是左移它first.

当满足以下明显限制时,上述结果应产生正确的结果:

first + count <= sizeof(UINT)*8 = 32

请注意,它也应该适用于"极端"情况.

  • 如果count = 0我们有(1 << count) = 1,因此((1 << count) - 1) = 0.
  • 如果count = 32我们有(1 << count) = 0,因为前导位溢出,并且根据C/C++规则,按位移位运算符不是循环的.然后 …

c bit-manipulation

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

将整数左移32位

在GCC下,以下代码始终返回<<if 的左操作数num1s == 0

0xFFFFFFFFu << (32-num1s);
Run Code Online (Sandbox Code Playgroud)

读完之后,为什么使用32次以上的整数时,32位整数为何不左移“ <<”?,以及David Heffernan引用的标准,似乎如果左操作数是unsigned,则它是定义的操作。仅当E1(左操作数)具有带符号的类型和非负值时,它才可能导致未定义的行为。

谁能解释标准是否明确指出,如果移位的数量大于该类型包含的位数,则它是未定义的行为

c++

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

Java语言规范中的Bitshift运算符描述

在JLS8的§JLS-15.19中指定

如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离.就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x1f(0b11111)的影响.因此,实际使用的移位距离始终在0到31的范围内,包括0和31.

我不清楚这个陈述是粗体.非常感谢一个例子.

java bit-shift jls

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

标签 统计

bit-shift ×3

bit-manipulation ×2

c ×2

java ×2

c++ ×1

jls ×1