撸了N久的代码,但是突然冒出来个位运算,我就蒙蔽了,这是什么?我是谁?我在干什么?我在哪?

1)闲扯

关于位运算符无非也就 与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)、无符号右移(>>>)

位运算其实就是二进制的运算,加减乘除适用于十进制,而位运算就是二进制的运算,但是由于我们的运算都是基于十进制来说的,所以会有点绕,略微有点难懂,接下来言归正传

2)关于二进制

我们在编码过程中应该会了解很多不同的进制,除去常用的十进制,还有二进制、八进制、十六进制,因为我们的位运算符主要用到二进制,就只讲讲二进制

几进制就是一个位上最多能表示几个数,如十进制的个位有0~9十个数字,八进制有0~7八个数字,二进制我们自然想到就是0~1两个数字

我们编码中最小的单位应该是字节,而一个字节有8位,每一位就是一个0或1,所以一个字节用二进制表示就是

这样的

3) 与运算符(&)

如果  4&7   那么这个应该怎么运算呢?

首先我们需要把两个十进制的数转换成二进制

4 : 0000 0100

7 : 0000 0111

在这里要提到一点,1表示true,0表示false

而与运算的时候相同位之间其实就是两个Boolean的运算

全true(1),即为true(1)

全false(0),即为false(0)

一false(0)一true(1),还是false(0)

4)或运算符(|)

以   5|9   为例

5 : 0000 0101

9 : 0000 1001

在做与运算的时候

                 遇true(1)就是true(1),

                 无true(1)就是false(0)

 

5) 异或运算符(^)

           以 7^15 为例

           7:   0000 0111

           15: 0000 1111

在异或的时候

只要相同都是false(0)

只有不同才是true(1)

6) 取反运算符(~)

例:   ~15

同样的先变成二进制:15:0000 1111

这个其实挺简单的,就是把1变0,0变1

注意:二进制中,最高位是符号位   1表示负数,0表示正数

7) 左移运算(<<)

      左移就是把所有位向左移动几位

如:   12 << 2    意思就是12向左移动两位

12的二进制是: 0000 1100

通过这个图我们可以看出来,所有的位全都向左移动两位,然后把右边空的两个位用0补上,最左边多出的两个位去掉,最后得到的结果就是00110000  结果就是48

我们用同样的办法算 12<<3  结果是 96

                            8<<4  结果是  128

  由此我们得出一个快速的算法    M << n   其实可以这么算   M << n  = M * 2n

 

8) 右移运算符(>>)

 

这个跟左移运算大体是一样的

     例: 12 >> 2

我们可以看出来右移和左移其实是一样的,但是还是有点不同的,不同点在于对于正数和负数补位的时候补的不一样,负数补1,正数补0

如我们再做一个 –8 的    -8>>2

这里总结一下,关于负数或者正数来说,移位的时候是一样的,但是在补位的时候,如果最高位是0就补0,如果最高位是1就补1

由此我们得出一个快速的算法    M >> n   其实可以这么算   M >> n  = M / 2n

9无符号右移(>>>)

     无符号右移(>>>)只对32位和64位有意义

在移动位的时候与右移运算符的移动方式一样的,区别只在于补位的时候不管是0还是1,都补0

这个就不画图了

最新文章

  1. php查找字符串首次出现的位置 判断字符串是否在另一个字符串中
  2. Python 之路 Day5 - 常用模块学习
  3. 最短的数字判断代码 js
  4. gdb 远程调试 android native 程序
  5. Java final,static 关键字
  6. 用U盘安装系统2
  7. 抓取Bing每日图片作为网站首页背景
  8. IOS 命令行安装备忘
  9. DEDECMS织梦列表页每隔N行文章添加一条分隔线
  10. 组件状态(TComponentState)11种和组件状态(TComponentStyle)4种
  11. luogu P2580 于是他错误的点名开始了
  12. 基于Selenium2+Java的UI自动化(6)-操作Alert、confirm、prompt弹出框
  13. MES设备支持快速完工
  14. PHP 面向切面编程
  15. PowerDesigner逆向生成MYSQL数据库表结构总结
  16. 定时重启tomcat
  17. Objective-C block深入理解
  18. 32网络通信之Poll模型
  19. MySql随手记要
  20. Syntax error on token(s), misplaced construct(s)

热门文章

  1. Python 之类型转换
  2. 解决Mysql Workbench的Error Code: 1175错误
  3. C#基础速学
  4. python合并多个txt文件成为一个文件
  5. Spring Web MVC处理流程
  6. GeoTrust 企业(OV)型 通配符(Wildcard) SSL证书
  7. [HZOI 2016]tree—增强版
  8. redis 初学
  9. Flume安装部署
  10. SpringBoot 注册拦截器方式及拦截器如何获取spring bean实例