我认为理解他们从根本上做的事情 - 操作位(翻转,移位,反转等)。
我的问题是我不知道何时需要使用它们,我认为我不完全理解它。
我知道一个字节中有8位,我知道这些位是0
或1
。现在,我开始感到困惑......我相信数据类型以不同方式定义位组合。因此,如果我声明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
。
这里发生了什么,何时需要应用这种操作位的方法?
答案 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