【详解】位运算符--正数及负数的位运算

位运算符的正负数计算,按位与&,按位或|,按位异或^,按位非~,左移<<,右移>>,以及涉及的码制相关知识。

一、码制

二进制数正负数三种表示法——原码;反码;补码。
二进制数的第一位是符号位,0正1负;后面是数值位,

正数的原码 = 反码 = 补码,即符号位为0,位于首位,随后是二进制数的绝对值。
示例:5的原码=0 0000101; 反码= 0 0000101; 补码=0 0000101

负数而言,三种表示法是不一样的。
①原码:符号位“1”+二进制数绝对值数值
②反码:符号位“1”+数值位按位取反
③补码:反码+“1”(末位)
示例:-5原码=1 0000101; 反码=1 1111010; 补码=1 1111011

二进制反码和补码运算性质:
[[X]反]反=[X]原
[[X]补]补=[X]原
[X]反+[Y]反=[X+Y]反(循环进位)
[X]补+[Y]补=[X+Y]补(舍弃进位)

二、位运算符

位运算符对二进制数进行操作,以二进制运算,文章中只使用8位二进制数进行表示,不过在计算机真实使用多少位存储,读者可以自己用左右移位运算符试试。 C/C++,JAVA,都是六种位运算符,运算的内在方式一样。
位运算符 执行原理
按位与 & 两个操作数同时为1,结果为1
按位或 l 两个操作数只要有一个为1,结果就为1
按位异或 ^ 两个操作数相同,结果为0,不相同,结果为1
按位非 ~ 操作数为1,结果为0;操作数为0,结果为1
左移 << 二进制数整体左移,右侧空位补0
右移 >> 二进制数整体右移,左侧空位补0

1、二元位运算符的运算

二元位运算符:& ; | ;^ ;<< ;>>
正数之间:位运算是使用他们的原码进行;
只要有负数:使用补码进行运算,如果运算结果符号位为1,那么需要求运算结果的补码才是答案,如果运算结果符号位为0,那么答案就是运算结果。

二元位运算符:<< ;>>
正数:左右移运算最终都为0
负数:左移最终的数值为0;右移为保证数值为负,末尾“+1”

按位与 &

两个操作数同时为1,结果为1

正数
0 0 0 0 0 1 0 0 = 4
0 0 0 0 0 1 0 1 = 5
————————
0 0 0 0 0 1 0 0 = 4 & 5 = 4

正数负数
1 1 1 1 1 1 0 0 = -4补
0 0 0 0 0 1 0 1 = 5
————————
0 0 0 0 0 1 0 0 = -4 & 5 = 4

负数
1 1 1 1 1 1 0 0 = -4补
1 1 1 1 1 0 1 1 = -5补
————————
1 1 1 1 1 0 0 0 = [-4 & -5]补; -4 & -5=[[-4 & -5]补]补 =1 0001000 = -8

按位或 |

两个操作数只要有一个为1,结果就为1

正数
0 0 0 0 0 1 0 0 = 4
0 0 0 0 0 1 0 1 = 5
————————
0 0 0 0 0 1 0 1 = 4 | 5 = 5

正数负数
1 1 1 1 1 1 0 0 = -4补
0 0 0 0 0 1 0 1 = 5补
————————
1 1 1 1 1 1 0 1 = [-4 | -5]补; -4 | -5=[[-4 | -5]补]补 =1 0000011 = -3

负数
1 1 1 1 1 1 0 0 = -4补
1 1 1 1 1 0 1 1 = -5补
————————
1 1 1 1 1 1 1 1 = [-4 | -5]补; -4 | -5=[[-4 | -5]补]补 =1 0000001 = -1

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值