Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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

在你的情况下,这意味着你

  • 0010_0000_0000_0000
  • 0010_0000_0000_0001

  • 它是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]);
    
    }