ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二进制转换与位运算

2022-09-10 09:34:02  阅读:194  来源: 互联网

标签:右移 转换 运算 符号 二进制 32 补码 位数


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有