理解按位运算及其在Java中的应用

时间:2013-08-29 18:03:15

标签: java bitwise-operators bit bit-shift

我认为理解他们从根本上做的事情 - 操作位(翻转,移位,反转等)。

我的问题是我不知道何时需要使用它们,我认为我不完全理解它。

我知道一个字节中有8位,我知道这些位是01。现在,我开始感到困惑......我相信数据类型以不同方式定义位组合。因此,如果我声明int,则为数字留出32位,如果我声明了一个char,则会留出8位,并且该数据类型的位定义一个字母。

运行这个想法,我在java中做了以下基本操作让我困惑:

int num = 00000010;
System.out.println(num);

这会打印8,如果我这样定义num

int num = 00000100;
System.out.println(num);

这会打印64

所以用按位操作练习(只是为了它的地狱)我试过这个:

int num = 00000010 << 1;
System.out.println(num);

然后打印16我认为它会将位向左移一位并打印64

这里发生了什么,何时需要应用这种操作位的方法?

1 个答案:

答案 0 :(得分:7)

当您指定一个前导零的数字时,您不小心指定了八进制文字。

00000010 => 1*8^1 + 0*8^0 => 8
00000100 => 1*8^2 + 0*8^1 + 0*8^0 => 64

JLS, Section 3.10.1,描述了八进制和二进制文字:

  

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

     

二进制数字由前导ASCII字符0b或0B组成   其次是一个或多个穿插的ASCII数字0或1   下划线,可以表示正整数,零整数或负整数。

您将8向左移动一位,实际上将其乘以2得到16。在位:

00000100 => 00001000
(8 => 16)

二进制文字用前导0b表示,例如:

0b000010 => 2