Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 如何创建十六进制补码?_Java_Hex - Fatal编程技术网

Java 如何创建十六进制补码?

Java 如何创建十六进制补码?,java,hex,Java,Hex,我有十六进制值,想创建位补码。例如: 0x00 -> 0xFF 0xC4 -> 0x3B 以下测试失败,但原因是什么 @Test public void testBitwiseComplement() { char[] buffer = new char[] {0x00, 0xff}; assertEquals(buffer[0], ~buffer[1]); //expected 0, but was -256 assertEquals(buffer[1],

我有十六进制值,想创建位补码。例如:

0x00 -> 0xFF
0xC4 -> 0x3B
以下测试失败,但原因是什么

@Test
public void testBitwiseComplement() {
    char[] buffer = new char[] {0x00, 0xff};
    assertEquals(buffer[0], ~buffer[1]); //expected 0, but was -256
    assertEquals(buffer[1], ~buffer[0]); //expected 255, but was -1
}

java中的按位补足符确实应用一元提升,其中“char”操作数提升为int

Java int是一种4字节的有符号类型,因此您可以看到它的区别

~buffer[0]=11111111111111111111111111111111  is correct
~buffer[0]=11111111  is incorrect

位求反运算符~[参考:

位求反运算符(~)可能作为一元表达式的一部分出现。~运算符的操作数类型必须是整数数据类型,否则会发生编译时错误。~运算符可能会在执行其计算之前执行类型转换。如果操作数的类型是byte、short或char,则运算符会在生成值之前将其操作数转换为int。Otherwise~运算符生成与其操作数相同类型的值

public class BitwiseNegation {

 public static void main(String args[]) throws Exception {
    char a = 0xff;
    char b = 0x00 ;

    System.out.printf(">>>>>a HexaDecimal: %x Decimal: %d\n", (int)a, (int)a);
    System.out.printf(">>>>>b HexaDecimal: %x Decimal: %d\n", (int)b, (int)b);

    System.out.printf(">>>>>~a HexaDecimal: %x Decimal: %d\n", ~a, ~a);
    System.out.printf(">>>>>~b HexaDecimal: %x Decimal: %d\n", ~b, ~b); 
    }

}
输出:

>>>>>a HexaDecimal: ff Decimal: 255   
>>>>>b HexaDecimal: 0 Decimal: 0  
>>>>>~a HexaDecimal: ffffff00 Decimal: -256  
>>>>>~b HexaDecimal: ffffffff Decimal: -1  
由于一元运算符的char被提升为int,值0xff变为0x000000ff,在按位补码之后变为0xffff00。现在这个数字是负数(符号位为1),通过颠倒二者的补码表示,数字变为-256。但是0x00的按位补码是-1。因此断言失败


因此,仅对于值0xFFFFFF和0x00000000,它们的按位补码也是相等的。

在字节数组而不是字符数组中尝试。对不起,我的意思是添加一个代码执行情况的解释:)我想你已经在代码框中包含了你的解释是的,这是我的第一个答案,我很难格式化我的帖子。我发送了一封邮件是的,请随意更改我所做的或以不同方式编辑它,并祝贺第一篇文章!当然,谢谢!