Java-按位操作没有得到预期的结果 private void test2(){ //这项测试需要两条短裤,并将它们粘在一起 //短时间内4位12位配置,然后中断 //再把他们分开看看是否有效! 短s0=4095; 短s1=13; 短sh=(短)((s1>>12)和0xF) }; System.out.println(sa[0]); System.out.println(sa[1]); }
我期望从中得到的是: 二进制的Java-按位操作没有得到预期的结果 private void test2(){ //这项测试需要两条短裤,并将它们粘在一起 //短时间内4位12位配置,然后中断 //再把他们分开看看是否有效! 短s0=4095; 短s1=13; 短sh=(短)((s1>>12)和0xF) }; System.out.println(sa[0]); System.out.println(sa[1]); },java,binary,bit-manipulation,Java,Binary,Bit Manipulation,我期望从中得到的是: 二进制的s0是b0000\u 1111\u 1111\u 1111 二进制的s1是b0000\u 0000\u 0000\u 1101 sh然后变成b1101\u 1111\u 1111\u 1111 前面的1是符号,剩余的15位给出了值,因此十进制的sh是-24575,但这不是我输出到控制台的内容(即-8193) 我做错了什么?b1101_1111_1111_1111是-8193,它正在输出正确的答案。可能想复习一下你的2s补品 结果实际上是正确的。二进制数用所谓的2s补
s0
是b0000\u 1111\u 1111\u 1111
二进制的s1
是b0000\u 0000\u 0000\u 1101
sh
然后变成b1101\u 1111\u 1111\u 1111
前面的1
是符号,剩余的15位给出了值,因此十进制的sh
是-24575
,但这不是我输出到控制台的内容(即-8193
)
我做错了什么?b1101_1111_1111_1111是-8193,它正在输出正确的答案。可能想复习一下你的2s补品
结果实际上是正确的。二进制数用所谓的2s补码表示。因此,要计算负数的绝对值,您不需要删除符号位,然后查看剩余的内容。你应该这样做: 1.翻转所有位,包括符号位 2.加1 在你的情况下,这意味着你
它是8193,这正是打印出来的。使用的表示法不是符号模,而是2-补码。因此,为了知道哪个数字由以1开头的一系列位表示,必须先减去1,然后再反转。在您的例子中,您将得到1101_1111_1111_1110的倒数,这将得到0010_0000_0000_0001,这就是8193。因此,没有任何问题-你只是混淆了内部表示机制。我的错,我是物理专业的毕业生,不是计算机科学专业的,谢谢你的回答。真的!使用2s补语肯定有原因,但乍一看似乎是错误的选择,哈哈!再次感谢。我们想想计算机是如何看待它的。如果你从0中减去1,你期望得到-1,但它实际上会变成1111111。。。这将是显示它的最大负整数,但它是负1作为2s补码。使用2s补码的原因是硬件实现-当您使用它们时,计算机可以使用与执行加法相同的硬件执行减法运算,无需特殊处理。我正在阅读wiki页面,它似乎比我认为的工作方式有很多优势,我认为这是1s的补充。我想这只是我们必须接受的非直觉的事情之一!量子力学一开始让我困惑,但现在它是我看到世界的唯一方式;诅咒你,牛顿,我相信你!我明白了,谢谢你的解释,我会读一些关于这件事的书=)
private void test2() {
// This test takes two shorts and sticks them together in a
// 4 bit 12 bit configuration within a short, it then breaks
// them apart again to see if it worked!
short s0 = 4095;
short s1 = 13;
short sh = (short)((s1 << 12) | s0);
System.out.println(sh);
short[] sa = new short[] {
(short)(sh & 0xFFF),
(short)((sh >>> 12) & 0xF)
};
System.out.println(sa[0]);
System.out.println(sa[1]);
}