将二进制输出限制为8位或4位

时间:2013-04-11 20:22:36

标签: java bit-manipulation

这是我的第一个问题

这是我的代码:

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);

5 个答案:

答案 0 :(得分:0)

int allOnes = ~0;

取整数0并按位运行NOT运算,因此它将以二进制表示形式包含所有1。 Intagers使用two's complement格式,这意味着所有位为1的单词的值为-1。

答案 1 :(得分:0)

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

int yournum = 35928304284 % 256;

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

int yournum = 3598249230 & 255;

这也适用,在这种情况下实际上是首选,因为它更快。如果两个关联位都是1,则按位和函数返回1;因为只有255的最后8位是1,所以整数隐含地限制为255。

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

int allOnes = ~0; 

创建一个全1的整数。由于twos complements的工作方式,该数字实际上代表-1。

答案 2 :(得分:0)

  1. 如果您只关心字节边界,请使用ByteBuffer

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

  2. 要将此字节限制为前四位或后四位,请使用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。
    2. 我建议阅读this tutorial on bitwise operations

答案 3 :(得分:0)

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

Integer.toBinaryString(left).substring(24)

Java中的〜运算符反转位模式。因此0变为ffff。

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

以下是所有bitwise operators for Java

答案 4 :(得分:0)

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

left &= (2 ^ n) - 1;

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

10011001 & 11110000 == 10010000; // true

这用于创建所谓的位掩码(http://en.wikipedia.org/wiki/Mask_(computing))。注意在这个例子中如何将第一个数字的左边4位复制到结果中,以及第4个数字在第二个数字中是如何全部的?这是一个有点面具的想法。

所以在你的情况下,让我们看看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";

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