代码之家  ›  专栏  ›  技术社区  ›  Droidum

Java OR运算符快疯了

  •  2
  • Droidum  · 技术社区  · 9 年前

    冒着为接下来的日子感到羞愧的风险…请向我解释以下内容。
    我需要用字节对整数进行算术运算。

    int a = 0x0100;
    byte b = (byte)0xff;
    int c = a | b;
    

    我希望c是 0x100 | 0xff = 0x1ff = 511 .
    但它是 0xffffffff = -1 为什么?

    6 回复  |  直到 9 年前
        1
  •  4
  •   Jin Kwon    9 年前

    b -1 . 当你这样做的时候 a | b , b 被提升为int,该int仍然 -1 .

    15.22.1. Integer Bitwise Operators &, ^, and |

    When both operands of an operator &, ^, or |
        are of a type that is convertible (§5.1.8) to a primitive integral type,
    binary numeric promotion is first performed on the operands (§5.6.2).
    

    因此 a | b 被评估为 a | -1 .

    final int a = 0x0100;
    final int b = 0xFF;
    final int c = a | b;
    

    我不知道你到底想做什么,但是。

    How could I accomplish adding 8 bits to the end of a int value in simple steps?
    
    int appendDummyOnes(final int value, final int size) {
        return (value << size) | (-1 >>> (Integer.SIZE - size));
    }
    
    int remarkDummyOnes(final int value, final int size) {
        return value | (-1 >>> (Integer.SIZE - size));
    }
    
        2
  •  1
  •   Henry    9 年前

    这是有效的:

    int c = a | (b & 0xff);
    
        3
  •  0
  •   Pavel Uvarov    9 年前

    在您的代码中

    int c = a | b;
    

    字节b扩展到int并保持值(带符号int中的值为-1)。 int中的此值为0xFFffFFff,因此在0x0100|0xFFffFFff之后,您将得到0xFFffff

    正如Jin Kwon的回答中所描述的,在当前情况下应该使用int。

        4
  •  0
  •   Community Egal    7 年前

    未服务行为的原因在 answer by Jin Kwon 。但请注意,有一个简单的解决方案(除了 (b & 0xFF) 其他答案中提到的):Java8为处理无符号值添加了一些方便的方法。所以你可以简单地

        int c = a | Byte.toUnsignedInt(b);
    
        5
  •  0
  •   Krishna Chalise    9 年前

    我是为了你的代码才这么做的。代码变得疯狂的原因有:

    您使用的是1字节(8位)的整数(int)数据类型,但处理的是2字节(16位)的数据。在这种情况下,MSB(第8位)作为符号位,0表示(-ve),1表示(+ve)。

    事实上,OR运算符并没有发疯,这是你的代码。您可以使用与下面类似的实现,使代码运行得足够好:

    import java.io.*;
    import java.util.*;
    
    class Lesson7{
        public static void main(String args[]){
            int a = 0x01;
            byte b = (byte)0x00;
            int c = a | b;
            System.out.println(c);
        }
    }
    
        6
  •  0
  •   Krishna Chalise    9 年前

    我用这个测试过:

    int a = 0x100;
    int b = 0xff;
    int c = a|b;
    System.out.println(c);