在博客园潜水好久了,今天兴致高昂的想写一篇博客,写的内容就是最近刚刚弄懂的关于位运算的题目。可能对那些老鸟老说这些是在基础不过的东西了,但是我相信还是有很多的博客需要了解并掌握这个基础的。

做题目前首先需要掌握的知识:

~           取反运算符,如果运算位为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)

  最后我们在脑子里模拟在内存中的运算:

                        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)

  最后我们在脑子里模拟在内存中的运算:

                        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

被程序员忽视的位运算相关推荐

  1. 如何在程序员中“C位出道”?

    不知不觉,圣诞节来临了.今年的冬天格外的寒冷,各大互联公司纷纷爆出裁员的消息,再加上本周的这波小降温,是不是觉得心拔凉拔凉的? 对于各位程序员来说,这个焦虑的寒冷的冬天除了别忘穿秋裤,让身体保暖,你还 ...

  2. c语言中左移和乘法谁高级,C程序员说使用移位运算代替乘法和除法更有效,是真的吗?...

    在C语言程序开发中,某些移位操作似乎达到与乘法和除法运算相同的效果. 例如,4 >> 1等于2,向右移一位等于2除. 类似地,2 << 1等于4,向左移一位等于2. 因此,一些 ...

  3. 容易被PHP程序员忽视的几个要点

    前几天就想好好整理上次遇到的问题,但是工作比较忙,就放到周末来写吧. 上次和同事沟通需求的时候,他给了一段他写好了的代码,我运行的时候发现了几个BUG,都是由于程序不严谨,考虑不周到,在这里写下来,和 ...

  4. 黑马程序员-10.一位老农带着猫、狗、鱼过河

    ------ Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 题目是10. 一位老农带着猫.狗.鱼过河,河边有一条船,每次老农只能带一只动物过河.当老农不和 ...

  5. 【建议收藏】面试官会问的位运算奇淫技巧

    往期热门文章: 1.到底可不可以用 kill -9 关闭程序?2.IDEA 2021首个大版本发布,新增了这几个超实用功能!3.Optional 是个好东西,你真的会用么?4.Java 8 Concu ...

  6. 面试了一位3年多开发经验程序员,期望工资10K

    前段时间面试了一位程序员,这位求职者有3年多开发经验,做Android开发,期望薪资10k,之前在私企工作,主要是接外包项目的. 在程序员行业,3年多工作经验,在广州,这期望薪资并不高. 通过面谈,发 ...

  7. 什么是整洁代码?大咖程序员们这样说

    这是本有关编写好程序的书.它充斥着代码.我们要从各个方向来考察这些代码.从顶向下,从底往上,从里而外.读完后,就能知道许多关于代码的事了. <代码整洁之道> 马丁 著 而且,我们还能说出好 ...

  8. Java程序员面试题

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...

  9. 优秀程序员眼中的整洁代码

    点击上方蓝字关注公众号 码个蛋第274次推文 看看大神们怎么说 作者:风铃无声江舟听雨 博客:https://www.jianshu.com/u/b525437c0777 有多少程序员,就有多少定义. ...

最新文章

  1. ping命令使用及其常用参数
  2. .net简单算法实现无限级分类(一)
  3. json数据格式 python_python中json是什么文件格式
  4. uva 10627 - Infinite Race(数论)
  5. Kafka:那我走?这个新一代消息中间件,彻底火了!
  6. 全面的GC原理及调优
  7. Django内置的用户认证
  8. git学习(9):git 添加 ssh keys 出现如下错误
  9. CLOUD TOOLKIT打包SPRINGCLOUD项目,多模块
  10. js最简单的几个特效_腊八蒜最简单做法,掌握这几个诀窍快速变绿,又脆又香,真过瘾...
  11. 自己实现的数值到大写人民币的实现
  12. 装饰器python详解_python装饰器详解
  13. html 图片的缩略图,纯CSS制作缩略图片
  14. 刷单之骗人先交钱QQ,如何从qq,找到他的ip
  15. 线性代数的本质-基向量部分理解
  16. 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心
  17. 如何推广自己的新网站
  18. 3:STM32CubeMX配置STM32F103C8T6驱动-RTC驱动
  19. R语言实验报告【全集】
  20. sau交流学习社区--看小说的lovebook一个无线端BS应用

热门文章

  1. Leading and Trailing(数论题)
  2. mapgis明码文件转为点线面文件_干货|MAPGIS的二十一个实用方法及技巧
  3. 吴麒pdf 自动控制原理下_设施大棚灌溉设备工作原理
  4. Git SSH Key生成,配置到GitHub 并测试
  5. Java中怎样遍历两个Date日期之间的每一天
  6. Winform中设置ZedGraph的坐标轴的标题和刻度不显示十次幂
  7. 从实例入手学习Vue-router的使用-实现音乐导航菜单切换
  8. 一分钟搞定Java环境变量配置
  9. arthas 排查内存溢出_小学妹问我:如何利用可视化工具排查问题?
  10. android 导入离线地图,Android, 离线地图-2