【问题标题】:Java left shift and fill with ZerosJava左移并用零填充
【发布时间】:2014-10-24 06:07:03
【问题描述】:

我想做左移但用零填充,就像

int number = 20 >>> 10 = ( 0000 0000 0000 0000 0000 0000 0001 0100 ) 
int number = 20 >>> 32‎ =  ( 0000 0000 0000 0000 0000 0000 0000 0000 )

我想对左移做同样的事情,因为没有运算符

int number = 20 << 32 = 0000 0000 0000 0000 0000 0000 0001 0100 ;

我想像 >>> 运算符一样用零填充它。那么我该怎么做呢?

【问题讨论】:

  • 这个不清楚; &gt;&gt;&gt; 32&lt;&lt; 32 都没有任何效果,那你到底在问什么?
  • 您说过20 &gt;&gt;&gt; 32 可以让您全神贯注 (0000 0000 0000 0000 0000 0000 0000 0000)。我没有得到所有位,我得到0001 0100
  • 阅读spec如果左侧操作数的提升类型为int,则仅将右侧操作数的最低五个位用作移位距离。如果左侧操作数的提升类型为长,则仅使用右侧操作数的最低六位作为移位距离。

标签: java bit-shift


【解决方案1】:

&lt;&lt; 左移运算符将根据您的需要引入零。

之所以有 2 个右移运算符(&gt;&gt;&gt;&gt;&gt;)是因为在 2 的补码形式中,负数在最左边的位位置有一个位值 1。右移运算符&gt;&gt; 将在左侧添加符号位(1 在负数的情况下,0 在正数或零的情况下),而另一个(&gt;&gt;&gt;)将始终添加零.

这两种右移运算符都有其用途。

语言规范规定,如果对int 应用位移运算符,因为它是 32 位长,则仅使用最低 5 位来确定移动数字的次数。

所以如果你移位 32,即二进制的100000,相当于移位 0,表示不移位!如果你想移动一个 64 位的long,最低 6 位仅用于告诉移动多少次。

【讨论】:

  • 好的,我明白了。我想在 32 位中这样做:( 20
  • 移位int数时,只有最低5位用于确定移位多少次,32的最低5位是00000,所以不会发生移位。
  • left shift 上签名位会发生什么?它会不受影响,只有其他位左移吗?
  • @Raghu 左移作为“正常”执行,符号位将是移到该位置的位。因此,移动正数可能会变为负数,反之亦然。例如。 2147483647 &lt;&lt; 1 将是 -2-2147483647 &lt;&lt; 1 将是 2
【解决方案2】:

您需要使用 long 类型并且只使用最低 32 位。 使用 and 运算符来完成。

    long intMask = 0x00000000FFFFFFFFL;
    long x = 0x00000000FFFFFFFFL;
    x = x<<32;
    int xi = (int)(x & intMask);
    System.out.println("xi=" + xi); //Result will be 0

查看问题:Declaring an unsigned int in Java

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2012-10-09
    • 1970-01-01
    • 2011-09-17
    • 2010-10-03
    相关资源
    最近更新 更多