被程序员忽视的位运算
在博客园潜水好久了,今天兴致高昂的想写一篇博客,写的内容就是最近刚刚弄懂的关于位运算的题目。可能对那些老鸟老说这些是在基础不过的东西了,但是我相信还是有很多的博客需要了解并掌握这个基础的。
做题目前首先需要掌握的知识:
~ 取反运算符,如果运算位为1取反后则变为0,如果运算为为0取反后则为1
& 与运算符,当运算的两个数同时为1时,则与运算的结果才为1,否则为0
| 或运算符,当运算的两个数只要有一个1时,则或运算的结果为1,否则为0.
^ 异或运算符,当两个运算位不同时为1,相同时是0
>> 右移运算符
<< 左移运算符
在内存中的运算都是以补码的形式存在的。
正数的原码、反码、补码相同。
负数的原码:最高为符号为0代表正、1代表负。后面的数为整数转换后的二进制数。
负数的反码:除符号为以外的位进行取反,1变为0,0变为1
负数的补码:负数的反码+1
这里举个简单的负数的例子,这里以整数占4个字节为例:
整数-5
(-5)10 的原码为:(10000000 00000000 00000000 00000101)2
(-5)10 的反码为:(11111111 11111111 11111111 11111010)2
(-5)10 的补码为:(11111111 11111111 11111111 11111011)2
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位。
算术左右:符号位不变,低位补0
基础知识就这么点了。不过这里没有必要死记,在一边做题目的时候,一边在看定义,这样对于理解会很有帮助的。
题目1
~2
因为:2为正数,所以2的原码等于2的反码等于2的补码
因为计算中的运算都是以补码的形式存在的。所以我们需要2的补码为(00000000 00000000 00000000 00000010)2
对2的补码进行取反运算得到: (11111111 11111111 11111111 11111101)2
此时得到的结论为(~2)的补码为 (11111111 11111111 11111111 11111101)2
因为最高位为1,所以是负数看,负数的补码等于负数的反码+1
所以又可以得到了(~2)的反码为 (11111111 11111111 11111111 11111100)2
根据反码又可以得到(~2)的原码为 (10000000 00000000 00000000 00000011)2
最后我们把二进制数转化为十进制数-3.
所以~2=-3
题目2
2&3 2|3
因为2、3都为正数,所以2、3的原码等于反码等于补码。
即(2)10的原码、反码、补码为 (00000000 00000000 00000000 00000010)2
(3)10的原码、反码、补码为 (00000000 00000000 00000000 00000011)2
紧接着我们开始与运算
00000000 00000000 00000000 00000010
& 00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000010
在接着我们开始或运算
00000000 00000000 00000000 00000010
| 00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000011
这与、或运算的结果为补码,我们还需要进行转化成原码。
因为最高为0(符号位),所以表示整数。
即原码等于反码等于补码。
所以2&3的原码用二进制表示为 00000000 00000000 00000000 00000010
转化成十进制为2
2|3的原码用二进制表示为 00000000 00000000 00000000 00000011
转化成十进制为3
题目3
13&7
同样我们可以从题目中知道13、7都是正数,所以正数的原码等于反码等于补码。
即(13)10的原码等于反码等于补码为 (00000000 00000000 00000000 00001101)2
(7)10的原码等于反码等于补码为 (00000000 00000000 00000000 00000111)2
最后我们在脑子里模拟在内存中的运算:
00000000 00000000 00000000 00001101
& 00000000 00000000 00000000 00000111
00000000 00000000 00000000 00000101
从结果中我们可以看出补码的最高位符号位为0表示正数。
所以(13&7)10的原码等于 (00000000 00000000 00000000 000000101)2
转化成十进制数为5
题目4
5|4
同样我们可以从题目中知道5、4都是正数,所以正数的原码等于反码等于补码。
即(5)10的原码等于反码等于补码为 (00000000 00000000 00000000 00000101)2
(4)10的原码等于反码等于补码为 (00000000 00000000 00000000 00000100)2
最后我们在脑子里模拟在内存中的运算:
00000000 00000000 00000000 00000101
| 00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000101
从结果中我们可以看出补码的最高位符号位为0表示正数。
所以(5|4)10的原码等于 (00000000 00000000 00000000 000000101)2
转化成十进制数为5
整数相对而言还是相对简单得,接着我们在来看几个负数的题目。
题目5
(~-5)
首先我们可以知道-5是负数
所以我们要先转化成原码
(-5)10的原码为 (10000000 00000000 00000000 00000101)2
在转化成为反码
(-5)10的反码为 (11111111 11111111 11111111 11111010)2
在转化成为补码
(-5)10的补码为 (11111111 11111111 11111111 11111011)2
得到了补码我们可以开始取反运算了:
(~-5)10的补码为 (00000000 00000000 00000000 00000100)2
这里可以看到最高为符号位为0,所以表示的是整数。
正数的原码等于反码等于补码。
所以(~-5)10的原码为 (00000000 00000000 00000000 00000100)2
最后(~-5)=4
紧接着我们来看左移运算符和右移运算符。
题目6
-1>>2
因为是-1是负数,所有我们先通过一系列的转化得到他的补码。
(-1)10 的原码为: (10000000 00000000 00000000 00000001)2
(-1)10 的反码为: (11111111 11111111 11111111 11111110)2
(-1)10 的补码为: (11111111 11111111 11111111 11111111)2
紧接着我们开始右移运算,溢出位用符号位来补。右移2位得到
(-1>>2)10 的补码为: (11111111 11111111 11111111 11111111)2
因为符号位为1,所以是负数,我们接着算出反码,原码。
(-1>>2)10 的反码为: (11111111 11111111 11111111 11111110)2
(-1>>2)10 的原码为: (10000000 00000000 00000000 00000001)2
所有-1>>2=-1
-1<<2
我直接用上面的到的
(-1)10 的补码为: (11111111 11111111 11111111 11111111)2
紧接着我们在对他进行左移,低位用0补。左移两位得到的结果是
(-1<<2)10 的补码为: (11111111 11111111 11111111 11111100)2
因为符号位为1,所以是负数,我们接着算出反码,原码。
(-1<<2)10 的反码为: (11111111 11111111 11111111 11111011)2
(-1>>2)10 的原码为: (10000000 00000000 00000000 00000100)2
所有-1<<2=-4
题目7
1>>2
因为1是正数,所有原码等于反码等于补码,即
(1)10 的原码等于反码等于补码为 (00000000 00000000 00000000 00000001)2
紧接着我们开始右移运算,
(1>>2)10 的补码为 (00000000 00000000 00000000 00000000)2
因为符号位为0,所有原码等于反码等于
补码为 (00000000 00000000 00000000 00000000)2
所有1>>2=0
1<<2
因为1是正数,所有原码等于反码等于补码,即
(1)10 的原码等于反码等于补码为 (00000000 00000000 00000000 00000001)2
紧接着我们开始右移运算,
(1>>2)10 的补码为 (00000000 00000000 00000000 00000100)2
因为符号位为0,所有原码等于反码等于
补码为 (00000000 00000000 00000000 00000100)2
所有1<<2=4
题目8
-3^3
首先-3的为负数,所以
(-3)10 的原码为 (10000000 00000000 00000000 00000011)2
(-3)10 的反码为 (11111111 11111111 11111111 11111100)2
(-3)10 的原码为 (11111111 11111111 11111111 11111101)2
在因为3为正数则
(3)10 的原码等于反码等于补码为 (00000000 00000000 00000000 00000011)2
紧接着我们开始异或运算
11111111 11111111 11111111 11111101
^ 00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111110
(-3^3) 10 的补码为 (11111111 11111111 11111111 11111110)2
因为符号位为1,所有是负数,所有
(-3^3) 10 的反码为 (11111111 11111111 11111111 11111101)2
(-3^3) 10 的原码为 (10000000 00000000 00000000 00000010)2
所有(-3^3)=-2
题目暂时就先这么多,因为我们要学会举一反三的思想。当然上面只不过是我们的理论知识,但是我们程序员需要有一种用代码检验真理的思想,我这里检验的代码用的是php,因为他的整型都是有符号的。
下面附上php代码
/*运行环境Win7 64位旗舰版*服务器IIS7.5*代码语言PHP*编写日期2012-5-31*编写人:JimmyWu* */<html><head><title>位运算练习</title><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head>
<body><?phpecho '整形的长度'.PHP_INT_SIZE.'<br />';//位运算echo '~2='.(~2).'<br />';echo '2&3='.(2&3).'<br />';echo '2|3='.(2|3).'<br />';echo '~-5='.(~-5).'<br />';echo '13&7='.(13&7).'<br />';echo '5|4='.(5|4).'<br />';echo '-3^3='.(-3^3).'<br />';echo '-1>>2 = '.(-1>>2).'<br />';echo '1>>2 = '.(1>>2).'<br />';echo '-1<<2 = '.(-1<<2).'<br />';echo '1<<2 = '.(1<<2).'<br />';?>
</body>
</html>
如果不对请指出并给我留言。最后欢迎关注我,也欢迎技术上的交流。
转载于:https://www.cnblogs.com/Jimmy009/archive/2012/05/31/2528992.html
被程序员忽视的位运算相关推荐
- 如何在程序员中“C位出道”?
不知不觉,圣诞节来临了.今年的冬天格外的寒冷,各大互联公司纷纷爆出裁员的消息,再加上本周的这波小降温,是不是觉得心拔凉拔凉的? 对于各位程序员来说,这个焦虑的寒冷的冬天除了别忘穿秋裤,让身体保暖,你还 ...
- c语言中左移和乘法谁高级,C程序员说使用移位运算代替乘法和除法更有效,是真的吗?...
在C语言程序开发中,某些移位操作似乎达到与乘法和除法运算相同的效果. 例如,4 >> 1等于2,向右移一位等于2除. 类似地,2 << 1等于4,向左移一位等于2. 因此,一些 ...
- 容易被PHP程序员忽视的几个要点
前几天就想好好整理上次遇到的问题,但是工作比较忙,就放到周末来写吧. 上次和同事沟通需求的时候,他给了一段他写好了的代码,我运行的时候发现了几个BUG,都是由于程序不严谨,考虑不周到,在这里写下来,和 ...
- 黑马程序员-10.一位老农带着猫、狗、鱼过河
------ Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 题目是10. 一位老农带着猫.狗.鱼过河,河边有一条船,每次老农只能带一只动物过河.当老农不和 ...
- 【建议收藏】面试官会问的位运算奇淫技巧
往期热门文章: 1.到底可不可以用 kill -9 关闭程序?2.IDEA 2021首个大版本发布,新增了这几个超实用功能!3.Optional 是个好东西,你真的会用么?4.Java 8 Concu ...
- 面试了一位3年多开发经验程序员,期望工资10K
前段时间面试了一位程序员,这位求职者有3年多开发经验,做Android开发,期望薪资10k,之前在私企工作,主要是接外包项目的. 在程序员行业,3年多工作经验,在广州,这期望薪资并不高. 通过面谈,发 ...
- 什么是整洁代码?大咖程序员们这样说
这是本有关编写好程序的书.它充斥着代码.我们要从各个方向来考察这些代码.从顶向下,从底往上,从里而外.读完后,就能知道许多关于代码的事了. <代码整洁之道> 马丁 著 而且,我们还能说出好 ...
- Java程序员面试题
下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...
- 优秀程序员眼中的整洁代码
点击上方蓝字关注公众号 码个蛋第274次推文 看看大神们怎么说 作者:风铃无声江舟听雨 博客:https://www.jianshu.com/u/b525437c0777 有多少程序员,就有多少定义. ...
最新文章
- ping命令使用及其常用参数
- .net简单算法实现无限级分类(一)
- json数据格式 python_python中json是什么文件格式
- uva 10627 - Infinite Race(数论)
- Kafka:那我走?这个新一代消息中间件,彻底火了!
- 全面的GC原理及调优
- Django内置的用户认证
- git学习(9):git 添加 ssh keys 出现如下错误
- CLOUD TOOLKIT打包SPRINGCLOUD项目,多模块
- js最简单的几个特效_腊八蒜最简单做法,掌握这几个诀窍快速变绿,又脆又香,真过瘾...
- 自己实现的数值到大写人民币的实现
- 装饰器python详解_python装饰器详解
- html 图片的缩略图,纯CSS制作缩略图片
- 刷单之骗人先交钱QQ,如何从qq,找到他的ip
- 线性代数的本质-基向量部分理解
- 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心
- 如何推广自己的新网站
- 3:STM32CubeMX配置STM32F103C8T6驱动-RTC驱动
- R语言实验报告【全集】
- sau交流学习社区--看小说的lovebook一个无线端BS应用
热门文章
- Leading and Trailing(数论题)
- mapgis明码文件转为点线面文件_干货|MAPGIS的二十一个实用方法及技巧
- 吴麒pdf 自动控制原理下_设施大棚灌溉设备工作原理
- Git SSH Key生成,配置到GitHub 并测试
- Java中怎样遍历两个Date日期之间的每一天
- Winform中设置ZedGraph的坐标轴的标题和刻度不显示十次幂
- 从实例入手学习Vue-router的使用-实现音乐导航菜单切换
- 一分钟搞定Java环境变量配置
- arthas 排查内存溢出_小学妹问我:如何利用可视化工具排查问题?
- android 导入离线地图,Android, 离线地图-2