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

3

我认为它们的基本操作是操作比特(翻转、移位、反转等...)。

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

我知道一个字节中有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

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


3
一个以0开头的int的含义是表示这个整数是一个八进制数。例如,数字0765代表的是十进制数501。如果希望使用十进制表示法,请避免在数字前加0 - Sotirios Delimanolis
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

谢谢您的回答,您何时需要做这样的事情呢? - hax0r_n_code
位移运算符相当于左移(<<)乘以2的amount次方,右移(>>)除以2的amount次方。 - rgettman
你知道有没有人在Java中有意使用八进制表示法,而会因需要不同的前缀而感到困扰吗?Java借用前导零作为八进制前缀似乎是一个奇怪的选择。 - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接