当前位置: 首页 > 面试题库 >

带负数移位的按位移位运算符

公孙巴英
2023-03-14
问题内容

当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。

即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错?

我能够成功运行以下代码,但我不知道它是如何工作的?

 public static void bitwiseleftShift(char testChar)
{
    int val=testChar-'a';
    int result= 1<<val;
    System.out.println("bit wise shift of 1 with val="+val+" is "+result);
}

输入项

   bitwiseleftShift('A');// ASCII 65
   bitwiseleftShift('0'); // ASCII 48

结果

   bit wise shift of 1 with val=-32 is 1
   bit wise shift of 1 with val=-49 is 32768

“ a”的ASCII码为97。有人可以帮助我了解其工作原理吗?


问题答案:

但是,如果b为负数,在运行时是否应该出错?

不符合Java语言规范第15.19节的规定:

如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值0x1f(0b11111)的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到31(含)范围内。

因此,-32的偏移实际上以0的偏移结束,而-49的偏移实际上以15的偏移结尾-因此,您看到了结果。



 类似资料:
  • 问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。

  • 问题内容: 在Java中,为什么-32 >>> -1 = 1? 它不仅限于-32。只要它们不是太大,它就适用于所有负数。 我发现 x >>> -1 = 1 x >>> -2 = 3 x >>> -3 = 7 x >>> -4 = 15 给出0> x>一些大的负数 -1与<< 1一样吗?但是-32 << 1 = -64。 我已经阅读了二进制补码,但仍然不明白其原因。 问题答案: 这是因为当您移位32

  • 本文向大家介绍python移位运算的实现,包括了python移位运算的实现的使用技巧和注意事项,需要的朋友参考一下 密码算法程序设计实践选的SHA-1。 在写的过程中遇到一丢丢关于python移位的问题,记录一下。 SHA-1其中第一步需要填充消息。简单阐述一下sha1填充消息的过程: 如输入消息“123”,先转成ascii码——313233,消息长度为3*8=24。 即00110001 0011

  • 我目前正在学习位操作,我的任务是做一个左旋转的4位整数。 我的4位左旋转代码是 我想做一个4位循环移位,以保持作为一个4位后旋转,但似乎不能理解它是如何工作的。 例如:10(1010)左旋转1位后给出5(0101),但它给出的值是21,比我的4位多。 任何能让我理解这个问题的帮助都将不胜感激!

  • 今天我学习了左移位运算符()。正如我所理解的,左移位运算符将位移动到指定的左边。我也知道乘以2表示移位。但是我很困惑,比如“移位”到底是什么意思,为什么当赋值的类型不同时,输出会有所不同? 当我调用下面的函数时,它给出的输出为

  • 5、带进位的循环移位指令 带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。 指令的格式:RCL/RCR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示