我在JAVA中看了几种不同的方法将二进制转换为整数。 但我无法弄清楚为什么会这样有效?
int res = 0;
res += 1 << 1;
res结果为2,我知道它向左移1位,在二进制中变为10。但是我混淆了它如何从二进制转换为整数,我想知道机制。
由于
答案 0 :(得分:1)
首先,让我们首先澄清一些术语。您认为是整数的实际上是base 10 notation中的数字,在Java的情况下是natural number,使用从0到9的10位数表示(因此基数为10)。
在binary notation中,我们只处理两位数来代表所有自然数。二进制(基数2)和十进制数(基数10)都是整数。
数字移位是乘以或除以数字的基数
您可以使用您已熟悉的10号基数轻松解释您观察到的位移效应。想象一下,你有一个预先填充0
s的方形区域。在每个字段中,您可以写入0到9之间的数字,并假设这些字段称为“位”。您将数字7
写入与右侧对齐的条带中:
0|0|0|0|0|7
想象一下整个条带现在代表整数7
。有效地进行的位移是将该条中的那些数字向左或向右移动,同时用0
s填充先前占用的点。想象一下,我们正在将7
向左移动一个位置:
0|0|0|0|7|0
通过将数字向左移动,我们实际上快速乘以10
(记住,这是我们在这里处理的数字系统的 base )。
当您将该数字向右移动一个点时,您会按10
执行除法。
位移是乘法或除以2
这同样适用于二进制数,这是计算机中数字的主要存储格式。二进制数字仅由两位数字组成,即1和0。
快速查看下表,以便更好地理解二进制数:
+-------------------+
| Decimal | Binary |
+---------+---------+
| 0000001 | 0000001 |
| 0000002 | 0000010 |
| 0000003 | 0000011 |
| 0000004 | 0000100 |
| 0000005 | 0000101 |
| 0000006 | 0000110 |
| 0000007 | 0000111 |
| ... | ... |
+---------+---------+
当我们将条带中的数字向左移动时,我们执行乘法2,当我们将数字向右移动时,我们执行2的除法。只需查看表格,然后查找十进制数字1.将其乘以2并查看二进制表示。再将其乘以2(十进制4)并查看二进制表示法。由于乘以2,二进制数字1
一个接一个地向左移动。
答案 1 :(得分:0)
res+= 1<<1;
可写为res = res + 1<<1;
如果您采用1<<1
,则表示1
表示为0x00000001 = 00000000 00000000 00000000 00000001
当你进行右移时,它变为00000000 00000000 00000000 00000010
是0x00000002
,其小数值为2