0

这是我的第一个问题

这是我的代码:

public class Bits{
   public static void main(String args[]){


   int i = 2 , j = 4;



   int allOnes = ~0;

   int left = allOnes << (j+1);

   System.out.println("Binary Equivalent at this stage: " +Integer.toBinaryString(left));

  }
}

以下是我得到的输出:

Binary Equivalent at this stage: 11111111111111111111111111100000

如何将其限制为仅从右侧开始的 8 位。我的意思是11100000

请解释。

这是我的第二个问题:

另外,我还有一个与上述问题完全不同的问题:

public static void main(String args[]){


   int i = 2 , j = 4;



   int allOnes = ~0; // will equal sequence of all 1s

   int left = allOnes << (j+1);

   System.out.println("Binary Equivalent at this stage: " +Integer.toBinaryString(left));

  }
}

由于我不明白以下行:

int allOnes = ~0; // will equal sequence of all 1s

当我试图输出“allOnes”的值时,我得到了“-1”作为我的输出。

我很难理解下一行,如下所示:

int left = allOnes << (j+1);
4

5 回答 5

0
int allOnes = ~0;

取整数 0 并按位应用 NOT 运算,因此它将在其二进制表示中全部为 1。整数使用二进制补码格式,这意味着所有位都为 1 的字的值是 -1。

于 2013-04-11T20:27:41.027 回答
0

十进制的 8 位最大值为 255。此时您可以使用模(余数)除法运算符将其限制为 8 位。例如:

int yournum = 35928304284 % 256;

将限制yournum为 8 位长度。此外,正如评论中所建议的,您可以这样做:

int yournum = 3598249230 & 255;

这也很有效,在这种情况下实际上是首选,因为它要快得多。如果两个相关位均为 1,则按位与函数返回 1;由于只有 255 的最后 8 位为 1,因此整数隐式限制为 255。

回答您的第二个问题:波浪号是按位反转运算符。因此,

int allOnes = ~0; 

创建一个全为 1 的整数。由于二进制补码的工作方式,该数字实际上代表 -1。

于 2013-04-11T20:28:37.293 回答
0
  1. 如果您只关心字节边界,请使用ByteBuffer

    字节 lastByte = ByteBuffer.allocate(4).putInt(i).array()[3];

要将此字节限制为前四位或后四位,请使用lastByte & 0b11110000lastByte & 0b00001111

  1. -1 的整数表示全为 1,即 32 位都设置为 1。您可以将第一位视为 -2^31(注意负号),随后的每个位为 2^30、2^29等。添加 2^0 + 2^1 + 2^2 ... + 2^30 - 2^31 = -1。

我建议阅读有关按位运算的本教程

于 2013-04-11T20:29:52.037 回答
0

对于 #1 Integer.toBinaryString(left) 正在打印 32 位(整数的长度),因此如果您只想要正确的 8,您可以执行以下操作:

Integer.toBinaryString(left).substring(24)

Java 中的 ~ 运算符反转位模式。因此0变成了ffff。

<< 运算符将位移动 x。您将这些位向左移动 5,因此您最终在右侧有 5 个零。

这是Java的所有按位运算符

于 2013-04-11T20:38:30.257 回答
0

首先,对于第一个问题,比我目前看到的更通用的解决方案是

left &= (2 ^ n) - 1;

其中 n 是您要从右侧取的二进制位数。这是基于按位与运算符 & 的,它比较两个数字中的相应位,如果它们都是 1,则输出 1,否则输出 0。例如:

10011001 & 11110000 == 10010000; // true

这用于创建所谓的位掩码(http://en.wikipedia.org/wiki/Mask_(computing))。请注意在此示例中如何将第一个数字的左 4 位复制到结果中,以及第二个数字中的相同 4 位如何全为 1?这就是位掩码中的想法。

所以在你的情况下,让我们看看 n = 8

left &= (2 ^ 8) - 1;

left &= 256 - 1;

left &= 255; // Note that &=, like += or *=, just means left = left & 255
             // Also, 255 is 11111111 in binary so it can be used as the bitmask for
             // the 8 rightmost bits.

Integer.toBinaryString(left) = "11100000";

您的第二个问题更深入,但您可能会从阅读 Wikipedia 文章 ( http://en.wikipedia.org/wiki/Two 's_complement) 中受益最大,而不是试图在这里理解一个简短的解释。

于 2013-04-11T20:55:24.513 回答