其他分享
首页 > 其他分享> > 二进制转换与位运算

二进制转换与位运算

作者:互联网

在应用程序常用的进制包含 二进制 八进制 十进制 十六进制

进制数 前缀 示例 进位规则
二进制 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

相当于是 3x2^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

标签:右移,转换,运算,符号,二进制,32,补码,位数
来源: https://www.cnblogs.com/peachyy/p/16675998.html