1)位运算

位运算是指对转换成二进制的数字进行每一位上的0、1的运算,运算涉及到五种运算:与(&),或(|),异或(^),左移(<<),右移(>>)。

如下表所示:

 
与(&) 0 & 0 =0 1 & 0 = 0 0 & 1 = 1 1 & 1 = 1
或(|) 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1
异或(^) 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 =0
左移(<<)

0001 1001 << 2 = 0110 0100

1000 1010 << 3 = 0101 0000

右移(>>)

0000 1010 >> 2 =  0000 0010

1000 1010 >> 3 = 1111 0001

左移:

左移运算符m << n表示把m左移n位。在左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。

右移:

右移运算符m >> n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但是与左移不一样的是,右移时候的最左边的n位处理:如果数字是一个无符号数值,则用0填补最左边的n位;如果数字是一个有符号数值,则用数字的符号位填补最左边的n位,如上表中的:1000 1010 >> 3 = 1111 0001。

这五种运算符都是双目操作符,另有一种单目操作符~,表示取反。即:~1 = 0,~0 = 1。

位运算符只能用于整型数据,对于其它类型的数据进行位操作编译器会报错。

位运算符的优先级比较低,因此应尽量使用括号来保证运算顺序。

2.位运算符的常用技巧

1)判断奇偶

只要根据最末位是0还是1即可判断整数的奇偶性。例如整数n,可以用if((n & 1) == 0)来判断,要比if(n % 2 == 0)判断奇偶性效率高。

2)交换数据

void swap(int &a, int &b)
{
if (a != b)
{
a ^= b;//a=(a^b); b ^= a;//^运算满足交换律,b^(a^b)=b^b^a a ^= b;//a=(a^b)^a
}
}

由于一个数和自己异或的结果为0,并且任何数与0异或都会不变的,所以第二步中b ^= a就等价于b = b ^ b ^ a = a,即b被赋上了a的值。

3)变换符号

正整数变成负整数,负整数变成正整数,只需将原数的二进制取反后加1即可。例如:

对于-11和11,可以通过下面的变换方法将-11变成11

1111 0101(二进制) 取反-> 0000 1010(二进制) 加1-> 0000 1011(二进制)

同样可以这样的将11变成-11

0000 1011(二进制) 取反-> 0000 0100(二进制) 加1-> 1111 0101(二进制)

3.位运算应用

1)高低位互换

给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为:
      10000110 11011000
将它的高低位进行交换,我们得到了一个新的二进制数:
      11011000 10000110
它即是十进制的55430。
这个问题用位操作解决起来非常方便,设x=34520=10000110 11011000(二进制) 由于x为无符号数,右移时会执行逻辑右移即高位补0,因此x右移8位将得到00000000 10000110。而x左移8位将得到11011000 00000000。可以发现只要将x>>8与x<<8这两个数相或就可以得到1101100010000110。
2)判断一个整数是不是2的整数次方

如果一个整数是2的整数次方,那么它的二进制标识中一定有且只有一位是1,而其他所有位均为0.

解决方案:

把这个整数减去1之后再和本身做与运算,这个整数中唯一的一个1就会变成0.所以只要判断是不是等于0即可。

最新文章

  1. sql将查询的结果集一次性插入到表变量中
  2. 【JS/CSS3】实现带预览图幻灯片效果~
  3. pixi.js教程中文版--基础篇
  4. Android上dip、dp、px、sp等单位说明
  5. 1-03 Sql Sever 的身份验证模式
  6. 【练习】使用服务下载图片并保存到sdcard
  7. JavaScript入门(4)
  8. 深入浅出SlidingMenu
  9. 同步linux服务器的时间
  10. 【转】Entity Framework 5.0系列之自动生成Code First代码
  11. BootStrap 专题
  12. HTML常用标签2
  13. 百度-淘宝-360搜索引擎搜索API
  14. java 封装及this 用法
  15. 思维导图软件 xMind 基本用法
  16. 原生js封装的获取某一天是当年的第几周方法
  17. CDH5上安装Hive,HBase,Impala,Spark等服务
  18. [转载]TortoiseGit安装与使用
  19. sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法
  20. jQuery源码学习笔记二

热门文章

  1. USACO CHAPTER 1 1.1 Ride 水题
  2. 2.Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running
  3. linux 常用alias
  4. compass项目监控文件报 /usr/bin/env 找不到文件
  5. [FlashPlyaer] FP版本20.0.267对Win10的64位系统的不兼容问题
  6. eclipse对项目整理分类
  7. Java SE 第十六讲----面向对象特征之继承
  8. 在delphi的exe文件中嵌入另外一个exe文件
  9. jquery ui datepicker中文显示
  10. tarjan 边双连通分量 对点进行分组 每组点都在一个双连通分量里边