这是我的第一个问题
这是我的代码:
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);
答案 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)
如果您只关心字节边界,请使用ByteBuffer
byte lastByte = ByteBuffer.allocate(4).putInt(i).array()[3];
要将此字节限制为前四位或后四位,请使用lastByte & 0b11110000
或lastByte & 0b00001111
答案 3 :(得分:0)
对于#1 Integer.toBinaryString(左)打印32位(整数的长度),所以如果你只想要正确的8,你可以执行以下操作:
Integer.toBinaryString(left).substring(24)
Java中的〜运算符反转位模式。因此0变为ffff。
&lt;&lt;运算符将位移位x。您将位向左移动5,因此您最终在右侧有5个零。
答案 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)中获益最多,而不是试图在这里理解一个简短的解释。