二进制转换与位运算
在应用程序常用的进制包含 二进制
八进制
十进制
十六进制
进制数 | 前缀 | 示例 | 进位规则 |
---|---|---|---|
二进制 | 0b | 0b100 | 包含0 1 逢2进1 符号位中0表示正数 1 表示负数 |
八进制 | 0 | 0100 | 0-7 逢8进位 |
十进制 | 无 | 100 表示100 | 0-9 |
十六进制 | 0x | 0x100 | 0-9 a(10) b(11) c(12) d(13) e(14) f(15) 逢16进位 |
二进制和十进制快速状态 8421法则
二进制 1 1 1 1 1 1 1 1
十进制 128 64 32 16 8 4 2 1
具体使用方法如 二进制数 11011 快速转换为十进制 1+2+0+8+16=27
从右边往左数 位数值如果是1则加上对于的8421法则中的十进制数据 1(第一位是1 对应值1)+2(第二位是1对应值2)+0(第三位不是1 那么值就为0)+8(第四位是1 对应值为8)+16(第五位为1 对应值为16)=27 所有合计等于27。这个二进制数就快速的转换为十进制了。
以下数字位数都是以Java为例子 java int是占4byte 1byte占用8bit 所以占32位。不同的类型占用的位数也不同 如果你问数字8是怎么存储的就不专业了,应该是数字8在32位下是怎么存储的 在64位是怎么存储的 比如java里面long类型就是64位。它和32位的存储肯定不一样的。
计算机中有符号的数据都是按补码的形式进行存储的。
正数的原码
反码
补码
都是一样的。
负数的转换 原码 ->反码->补码
原码
符号位+数值位数
反码
除符号位不变 其他位全部取反 1变0 0变1
补码
在反码的基础上+1就是补码
比如 +9 存储为原码=反码=补码0b00000000000000000000000000001001
比如-9 就相对复杂一些 存储的补码转换原理为
原码 0b00000000000000000000000000001001
反码 0b11111111111111111111111111110110
补码 0b11111111111111111111111111110111
位运算
位运算的操作数都是以二进制类型而且是补码形式进行计算的,在看原码的时候经常看到这类运算符。
符号 | 描述 | 示例 |
---|---|---|
& | 按位与 2个位数值都为1 返回1 | 3&4 |
| | 按位或 2个位数值其中1个位1 返回1 | 3|4 |
^ | 按位异或 2个位数中不相同返回1 | |
~ | 按位取反 位数中的1变0,0变1 | |
<< | 左移 操作数乘以2的n(移动位数)次幂 | |
>> | 右移 操作数除以2的n(移动位数)次幂 用原符号位填充 | |
>>> | 无符号右移 操作数除以2的n(移动位数)次幂 符号位用0填充 |
&位与运算
& 位与 2个操作二进制位数中所有位数值都相等就
3&4=0
3二进制 0b00000000000000000000000000000011
4二进制 0b00000000000000000000000000000100
=0b00000000000000000000000000000000
|位或运算
2个位数值其中1个位1 返回1
3|4=7
3二进制 0b00000000000000000000000000000011
4二进制 0b00000000000000000000000000000100
=0b00000000000000000000000000000111
^异或运算
2个位数中不相同返回1
3&4=7
3二进制 0b00000000000000000000000000000011
4二进制 0b00000000000000000000000000000100
=0b00000000000000000000000000000111
一个数据对相同的数据异或2次 值不变 ,在加密场景中比较常见。
int a=3;int b=4;
System.out.println(a^b^b);//值输出3
用异或实现2个数据交换
int a=3;int b=4;
a=a^b;
b=a^b;
a=a^b;
System.out.println("a="+a+",b="+b);
//输出a=4,b=3
~按位取反运算符
位数位1 变0 ,位数位0变1
~3=-4
3二进制 0b00000000000000000000000000000011
=0b11111111111111111111111111111100 这个数是补码
<<左移
操作数乘以2的n(移动位数)次幂
3<<4 = 48
3的二进制0b00000000000000000000000000000011
左移4位=0b00000000000000000000000000110000
相当于是 3×2^4=48
>>右移
操作数除以2的n(移动位数)次幂 往右移位的时候左边会空出来,补充的数位符号位 0则用0填充 1 则用1填充
32>>4=2
32的二进制0b0000000000000000000000000100000
右移4位=0b0000000000000000000000000000010
相当于是32/2^4=2
>>>无符号右移
操作数除以2的n(移动位数)次幂 往右移位的时候左边会空出来,补充的数位符位0
这也是和有符号右移的区别 。正数无符号右移和有符号右移的值一致。
32>>>4=2
32的二进制0b0000000000000000000000000100000
右移4位=0b0000000000000000000000000000010
相当于是32/2^4=2
-32>>>4=268435454
-32的二进制补码位0b11111111111111111111111111100000
移4位=0b00001111111111111111111111111110