为什么“010”等于8?

时间:2013-07-04 12:05:47

标签: java binary format bit-manipulation

我的简单问题是:

System.out.println(010|4);

打印“12”?我理解按位OR运算符,但为什么“010”等于8?这绝对不是恭维2的通知,那么如何解码这个数字?

6 个答案:

答案 0 :(得分:7)

前导0表示octal numeric value,因此可以解码值010010 = 1 * 81 + 0 * 80 = 8

答案 1 :(得分:6)

查看Java Language Specification, Chapter 3.10.1 Integer Literals

  

整数文字可以用十进制(十进制)表示,十六进制   (基数16),八进制(基数8),或二进制(基数2)。

     

[...]

     

八进制数字由ASCII数字0后跟一个或多个组成   ASCII数字0到7 穿插着下划线,并且可以   表示正整数,零整数或负整数。

现在你应该理解为什么0108

答案 2 :(得分:1)

这是因为java将其作为八进制文字,因此产生12.尝试System.out.println(10|4),结果为14.因为这次它被视为十进制文字。

答案 3 :(得分:1)

正如大家在此提到的那样,010是一个八进制整数文字。前导0指定它是八进制表示。实际值为:

  

1 * 8 ^ 1 + 0 * 8 ^ 0 = 8(十进制)= 1000(二进制最后4位数)

现在回到SOP:

System.out.println(010|4);

0104上应用按位OR(仅考虑最后4位数)=>

  

1000 | 0100

     

= 1100

     

= 1 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0

     

= 8 + 4 + 0 + 0

     

= 12(十进制)

答案 4 :(得分:1)

Java中符合以下条件的任何数字- A.数字应有三个或更多数字 B.Number应该以0开头。 如果以上条件为true,则将数字视为Octal_Base(8)Number。 因此, 010 =(8 ^ 2)* 0 +(8 ^ 1)* 1 +(8 ^ 0)* 0 = 64 * 0 + 8 * 1 + 1 * 0 = 8 所以, 010 = 8

答案 5 :(得分:0)

有一点你应该考虑如果“0XX”这个数字是八进制的,即两个X都在[0,7]范围内,否则会导致“整数太大”。