【详解】位运算符--正数及负数的位运算
位运算符的正负数计算,按位与&,按位或|,按位异或^,按位非~,左移<<,右移>>,以及涉及的码制相关知识。
文章目录
- 一、码制
- 二、位运算符
- 1、二元位运算符的运算
- 按位与 &
- 按位或 |
- 按位异或 ^
- 左移 <<
- 右移 >>
- 2、一元位运算符的运算
- 按位非 ~
- 三、测试代码
一、码制
二进制数正负数三种表示法——原码;反码;补码。
二进制数的第一位是符号位,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
按位异或 ^
两个操作数相同,结果为0,不相同,结果为1
正数
0 0 0 0 0 1 0 0 = 4
0 0 0 0 0 1 0 1 = 5
————————
0 0 0 0 0 0 0 1 = 4 ^ 5 = 1正数负数
1 1 1 1 1 1 0 0 = -4补
0 0 0 0 0 1 0 1 = 5补
————————
1 1 1 1 1 0 0 1 = [-4 ^ -5]补; -4 ^ -5=[[-4 ^ -5]补]补 =1 0000111 = -7负数
1 1 1 1 1 1 0 0 = -4补
1 1 1 1 1 0 1 1 = -5补
————————
0 0 0 0 0 1 1 1 = -4 ^ -5 = 7
左移 <<
二进制数整体左移,低位(右侧空位)补0
正数
0 0 0 0 0 0 0 0 0 1 0 1 = 5
0 0 0 0 0 0 0 1 0 1 0 0 = 5<<2 = 20负数
0 0 0 0 1 0 0 0 0 1 0 1 = -5
0 0 1 0 0 0 0 1 0 1 0 0 = -5<<2 = -20
右移 >>
二进制数整体右移,高位(左侧空位)补0
正数
0 0 0 0 0 0 0 0 0 1 0 1 = 5
0 0 0 0 0 0 0 0 0 0 0 1 = 5>>2 = 1负数
0 0 0 0 1 0 0 0 0 1 0 1 = -5
-5>>2
0 0 0 0 0 0 1 0 0 0 0 1
0 0 0 0 0 0 1 0 0 0 1 0 末尾“+1”
1 0010010 = -5>>2 = -2
2、一元位运算符的运算
一元位运算符:~
按位非 ~
按位非 ~
正数:求取非后的二进制码的补码,就是答案
负数:对取非后的二进制码的求其补码的两个步骤颠倒求出来的,就是答案
操作数为1,结果为0;操作数为0,结果为1
正数
0 0 0 0 0 1 0 1 = 5
~5
1 1 1 1 1 0 1 0
1 0 0 0 0 1 0 1 符号位不变,取反
1 0 0 0 0 1 1 0 符号位不变,末尾加一
~5 = 1 0000110 = -6负数
1 0 0 0 0 1 0 1 = -5
~(-5)
0 1 1 1 1 0 1 0
0 1 1 1 1 0 1 1 符号位不变,末尾加一
0 0 0 0 0 1 0 0 符号位不变,取反
~(-5) = 0 0000100 = 4
三、测试代码
大家可以复制来验证一下上文说的对不对哈哈
void test()
{cout << "4 & 5 = " << (4 & 5) << endl;cout << "-4 & 5 = " << (-4 & 5) << endl;cout << "-4 & -5 = " << (-4 & -5) << endl<<endl;cout << "4 | 5 = " << (4 | 5) << endl;cout << "-4 | 5 = " << (-4 | 5) << endl;cout << "-4 | -5 = " << (-4 | -5) << endl<<endl;cout << "4 ^ 5 = " << (4 ^ 5) << endl;cout << "-4 ^ 5 = " << (-4 ^ 5) << endl;cout << "-4 ^ -5 = " << (-4 ^ -5) << endl<<endl;cout << "~5 = " << ~5 << endl;cout << "~(-5) = " << ~(-5) << endl<<endl;cout << "5<<2 = " << (5 << 3) << endl;cout << "-5<<2 = " << (-5 << 3) << endl<<endl;cout << "5>>2 = " << (5 >> 2) << endl;cout << "-5>>2 = " << (-5 >> 2) << endl<<endl;cout << "5<<65 = " << (5 << 65) << endl;cout << "-5<<65 = " << (-5 << 65) << endl<<endl;cout << "5>>10 = " << (5 >> 10) << endl;cout << "-5>>10 = " << (-5 >> 10) << endl<<endl;
}
如有不足之处,还望指正 1。
如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎
【详解】位运算符--正数及负数的位运算相关推荐
- Java移位运算符详解实例——左移位运算符、带符号的右移位运算符
移位运算符也针对二进制的"位",它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>). 1.左移运算符 ...
- 一个竖杠在python中代表什么_详解js运算符单竖杠“|”与“||”的用法和作用介绍...
在js开发应用中我们通常会碰到"|"与"||"了,那么在运算中"|"与"||"是什么意思呢? 在js整数操作的时候,相当 ...
- 商汤招股书详解:40名教授250+博士3593位工程师,AI收入亚洲第一,一年15亿研发工资支出...
边策 李明敏 杨博雯 李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI 商汤来了! 8月28日,超级AI独角兽商汤科技,向香港联交所提交招股书,正式冲刺IPO上市. 商汤有何不同? 在招股书 ...
- 详解加法与减法对CPU标志位的影响
相信对于每一个汇编初学者而言汇编中的标志位都是一个相当绕脑并且理解起来十分困难的东西.实际上标志位是一个非常简单的东西,之所以理解起来困难,是因为人为的添加了太多的解释进去. 例如1000 1111这 ...
- 微信小程序详解(4.运算符和列表渲染)
运算符 介绍 运算符的意义就不必我多讲了把,主要就是为了简便计算,优化代码,给代码增强了逻辑性,让我们的运算都方便. 通常来说,我们运算的方式都是依赖于这些运算符的作用,它们就像一个链接,把数据链接起 ...
- 详解JavaScript运算符(一):赋值、算术、复合运算符
JavaScript运算符分别为: 赋值运算符.算术运算符.字符串运算符.逻辑运算符.关系运算符.位运算符,其中赋值运算符和算法运算符结合到一起组成复合运算符. 1.赋值运算符 赋值运算符只有一个:即 ...
- c语言位运算符的应用,c语言位运算(c语言位运算符的用法)
a=1^8 b=32^32 c=7^3 d=4&3 e=4|3 f=1&-1 求值 求详解 求值 为什么等于这么. 一.位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ...
- c语言位运算符读音,C语言六种位运算符
位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&&quo ...
- python代码案例详解-Python运算符重载详解及实例代码
Python运算符重载 Python语言提供了运算符重载功能,增强了语言的灵活性,这一点与C++有点类似又有些不同.鉴于它的特殊性,今天就来讨论一下Python运算符重载. Python语言本身提供了 ...
最新文章
- 菜鸟学Linux 第044篇笔记 算法和私有CA
- linux引导过程简述6,CentOS 6系统启动引导过程讲解
- Spring 3 MVC and XML example
- 不用注册的麦咖啡永久使用
- iOS经典面试题之深入分析“内存平移”的原理
- jdk卸载不干净怎么办_【实用】流氓软件卸载不干净?
- com.google.common.collect.Range 集合计算
- CSS布局讲解-float浮动布局使用
- Vue.js(2.x)之插值
- 巧用EasyRecovery监控硬盘 为你的电脑保驾护航
- linux可以同时有两个mysql吗_Linux 同一系统安装两个MySQL
- db2v9/9.5高级应用开发_11月26日 l FloMASTER元器件开发及高级应用公开课
- Neo4j简单构建知识图谱实例
- steamcommunity本地反代443端口/80端口被占用解决办法
- 深入剖析RGB、CMYK、HSB、LAB
- 计算机桌面上的声音图标没了怎么办,电脑声音图标不见了怎么办超详细教程
- 倒计时7天丨2022全球边缘计算大会深圳站参会指南来啦!
- 对话 IJCAI 07「卓越研究奖」得主 Alan Bundy :理解智能的本质是 AI 发展的终极目标
- uni-app项目起步
- 微信小程序生态1-初识小程序
热门文章
- 从近十年国家出台的文件看我国高等教育政策制定
- 清华大学计算机刘云鹏,清华在河南录取工作结束
- 胜为蓝牙适配器驱动_胜为udc 324b驱动下载-udc 324b蓝牙驱动下载 v6.5.1.2700官方版--pc6下载站...
- 今天给大家分享电脑cmd命令大全,使用cmd命令可以高效的对电脑进行配置或者快速打开自己需要的服务,有需要的朋友赶紧收藏吧!
- 2019保定中考计算机时间安排,2019年保定市高中招生计划一览表
- Activiti基础02:手把手带你来创建一个Activiti工作流
- 一次用Notion辅助学习的尝试
- python语言的类型是_python到底是什么类型的语言
- 学会简单的磨皮教程,其实你皮肤也很好
- Linux shell输出制表符,关于bash:如何在终端中打印制表符分隔文件