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

hax*_*ode 2 java bit-shift bit bitwise-operators

我认为理解他们从根本上做什么 - 操作位(翻转,移位,反转等).

我的问题是我不知道什么时候需要使用它们,我认为我不完全理解它.

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

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

int num = 00000010;
System.out.println(num);
Run Code Online (Sandbox Code Playgroud)

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

int num = 00000100;
System.out.println(num);
Run Code Online (Sandbox Code Playgroud)

这打印 64

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

int num = 00000010 << 1;
System.out.println(num);
Run Code Online (Sandbox Code Playgroud)

它打印的16位置我认为它会将位向左移动并打印64.

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

rge*_*man 7

指定带前导零的数字时,您不小心指定了八进制文字.

00000010 => 1*8^1 + 0*8^0 => 8
00000100 => 1*8^2 + 0*8^1 + 0*8^0 => 64
Run Code Online (Sandbox Code Playgroud)

JLS,第3.10.1节,描述八进制和二进制文字:

八进制数字由ASCII数字0后跟一个或多个散布有下划线的ASCII数字0到7组成,并且可以表示正整数,零整数或负整数.

二进制数字由前导ASCII字符0b或0B后跟一个或多个散布有下划线的ASCII数字0或1组成,并且可以表示正整数,零整数或负整数.

你将你的位移8到左边,有效地将它乘以2得到16.比特:

00000100 => 00001000
(8 => 16)
Run Code Online (Sandbox Code Playgroud)

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

0b000010 => 2
Run Code Online (Sandbox Code Playgroud)