3

我认为了解它们的基本功能 - 对位进行操作(翻转、移位、反转等......)。

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

我知道一个字节中有 8 位,并且我知道位是 a01. 现在这里是我开始感到困惑的地方......我相信数据类型以不同的方式定义位组合。因此,如果我声明一个int,则为数字留出 32 位,如果我声明一个字符,则留出 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

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

4

1 回答 1

8

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

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

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

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

二进制数字由前导 ASCII 字符 0b 或 0B 后跟一个或多个 ASCII 数字 0 或 1 和下划线组成,可以表示正整数、零整数或负整数。

您将您的位移8向左一位,有效地将其乘以2得到16. 位:

00000100 => 00001000
(8 => 16)

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

0b000010 => 2
于 2013-08-29T18:06:00.773 回答