文章来源:ktyanny
位运算操作
由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

按位与(Bitwise AND),运算符号为&
a&b 的操作的结果:a、b中对应位同时为1,则对应结果位也为1、
例如:
10010001101000101011001111000

& 111111100000000

           10101100000000

对10101100000000进行右移8位得到的是101011,这就得到了a的8~15位的掩码了。那么根据这个启示,判断一个整数是否是处于 0-65535 之间(常用的越界判断):
用一般的 (a >= 0) && (a <= 65535) 可能要两次判断。
改用位运算只要一次:
a & ~((1 << 16)-1)
后面的常数是编译时就算好了的。其实只要算一次逻辑与就行了。

常用技巧:

1、 用于整数的奇偶性判断

一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。二进制的末位为0表示偶数,最末位为1表示奇数。使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。

2、 判断n是否是2的正整数冪

(!(n&(n-1)) ) && n

好!看完上面的两个小例子,相信大家都有一个感性的认识。从理论上讲,如果一个数a他是2的正整数幂,那么a 的二进制形式必定为1000…..(后面有0个或者多个0),那么结论就很显然了。

3、 统计n中1的个数

朴素的统计办法是:先判断n的奇偶性,为奇数时计数器增加1,然后将n右移一位,重复上面步骤,直到移位完毕。
朴素的统计办法是比较简单的,那么我们来看看比较高级的办法。

举例说明,考虑2位整数 n=11,里边有2个1,先提取里边的偶数位10,奇数位01,把偶数位右移1位,然后与奇数位相加,因为每对奇偶位相加的和不会超过“两位”,所以结果中每两位保存着数n中1的个数;相应的如果n是四位整数 n=0111,先以“一位”为单位做奇偶位提取,然后偶数位移位(右移1位),相加;再以“两位”为单位做奇偶提取,偶数位移位(这时就需要移2位),相加,因为此时没对奇偶位的和不会超过“四位”,所以结果中保存着n中1的个数,依次类推可以得出更多位n的算法。整个思想类似分治法。
在这里就顺便说一下常用的二进制数:
0xAAAAAAAA=10101010101010101010101010101010
0x55555555 = 1010101010101010101010101010101(奇数位为1,以1位为单位提取奇偶位)

0xCCCCCCCC = 11001100110011001100110011001100
0x33333333 = 110011001100110011001100110011(以“2位”为单位提取奇偶位)

0xF0F0F0F0 = 11110000111100001111000011110000
0x0F0F0F0F = 1111000011110000111100001111(以“8位”为单位提取奇偶位)

0xFFFF0000 =11111111111111110000000000000000
0x0000FFFF = 1111111111111111(以“16位”为单位提取奇偶位)

例如:32位无符号数的1的个数可以这样数:

int count_one(unsigned long n)
{
//0xAAAAAAAA,0x55555555分别是以“1位”为单位提取奇偶位
n = ((n & 0xAAAAAAAA) >> 1) + (n & 0x55555555);

//0xCCCCCCCC,0x33333333分别是以“2位”为单位提取奇偶位
n = ((n & 0xCCCCCCCC) >> 2) + (n & 0x33333333);//0xF0F0F0F0,0x0F0F0F0F分别是以“4位”为单位提取奇偶位
n = ((n & 0xF0F0F0F0) >> 4) + (n & 0x0F0F0F0F);//0xFF00FF00,0x00FF00FF分别是以“8位”为单位提取奇偶位
n = ((n & 0xFF00FF00) >> 8) + (n & 0x00FF00FF);//0xFFFF0000,0x0000FFFF分别是以“16位”为单位提取奇偶位
n = ((n & 0xFFFF0000) >> 16) + (n & 0x0000FFFF);return n;

}

举个例子吧,比如说我的生日是农历2月11,就用211吧,转成二进制:
n = 11010011
计算n = ((n & 0xAAAAAAAA) >> 1) + (n & 0x55555555);
得到 n = 10010010
计算n = ((n & 0xCCCCCCCC) >> 2) + (n & 0x33333333);
得到 n = 00110010
计算n = ((n & 0xF0F0F0F0) >> 4) + (n & 0x0F0F0F0F);
得到 n = 00000101 —————–à无法再分了,那么5就是答案了。

4、对于正整数的模运算(注意,负数不能这么算)

先说下比较简单的:
乘除法是很消耗时间的,只要对数左移一位就是乘以2,右移一位就是除以2,传说用位运算效率提高了60%。
乘2^k 众所周知: n<

位运算 之(1) 按位与(AND) 操作相关推荐

  1. 位运算小结(按位与、按位或、按位异或、取反、左移、右移)

    位运算小结(按位与.按位或.按位异或.取反.左移.右移) 位运算主要包括按位与(&).按位或(|).按位异或(^).取反(~).左移(<<).右移(>>)这几种,其中除 ...

  2. 位运算中的按位与(),按位或(|),按位异或(^)

    大家好,今天和大家分享的是位运算符中的按位与,按位或,按位异或. 首先先声明一下:参加位运算的两个数都要用二进制来表示. 一般给的数都是十进制,十进制转化为二进制的方法如下: 注意:如果给的是八进制, ...

  3. c语言 10进制 按位与,位运算小结(按位与、按位或、按位异或、取反、左移、右移)...

    原标题:位运算小结(按位与.按位或.按位异或.取反.左移.右移) 位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从0.1开 ...

  4. 位运算专题一:位与、位或、位反

    位运算只用于所有的整型!!(char,short,int,long int,long long,unsigned char,unsigned short......),浮点值均不适用!!! 位运算有哪 ...

  5. 【位运算】代码中的常用操作

    作者:力扣(LeetCode) 链接:https://www.zhihu.com/question/38206659/answer/736472332 来源:知乎 著作权归作者所有.商业转载请联系作者 ...

  6. 位运算 之(1) 按位与(AND) 操作【转载】

    由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为 ...

  7. 位运算:按位与、按位或、按位异或、按位左移、按位右移

    目录 一.基础知识补充 (1)位运算 (2)二进制的详细操作 二.位运算 (1)按位与(&) (2)按位或(|) (3)按位异或(^) (4)按位左移(<<) (5)按位右移(&g ...

  8. Java位运算(按位与、按位或、异或)

    一.位运算 位即二进制位或bit位 所有运算到计算中底层中都会变成位运算,位运算可以提高程序的效率,而且我们在研究JDK或者某个框架的源码时,会发现很多地方都用到了位运算! 例如我们在对数组进行排序时 ...

  9. C语言用位运算构建特定的二进制数

    用位运算构建特定的二进制数 寄存器操作需要给特定位给特定值 使用移位获取特定位为1的二进制数 结合位取反获取特定位为0的二进制数 寄存器操作需要给特定位给特定值 (1)对寄存器特定位进行置1或者清0或 ...

最新文章

  1. 导致网速变慢的安全隐患
  2. linux 调用 fudanNLP
  3. recyclerview滑动到顶部和底部监听+上滑下滑监听
  4. 解决windows下Error:node with name rabbit already running on “XXX” 和管理页面打不开问题
  5. 原生 js 模拟 alert 弹窗
  6. @vail 判断某字段在范围内_条件判断函数If,你真的会使用吗?实用技巧都掌握吗?...
  7. Xshell 连接CentOS服务器解密
  8. 线程的异常捕获与线程池的异常捕获
  9. mysql批量导出工具_sql数据库批量导出|
  10. 【黑马程序员pink老师前端】HTML
  11. 合肥盛荣乒乓球俱乐部学习感悟
  12. thingworx集中常见数据存储方法
  13. 不同公司系统的对接心得
  14. Optimizing radiotherapy plans for cancer treatment with Tensor Networks解读
  15. 前端面试总结(转载请标明)
  16. 关于LaTeX中的正文的字体大小
  17. 《网络安全工程师笔记》 第一章:虚拟化架构与系统部署
  18. 末日觉醒服务器端文件,生存RPG《末日觉醒》免费更新公布 增加专用PVE服务器...
  19. FLV网络视频转换成MP3
  20. 计算机室内设计 cad 论文,cad室内设计 毕业论文

热门文章

  1. Spring中的部分设计模式
  2. 深入理解JVM一字节码执行
  3. 腾讯云中cos的yml配置文件
  4. n级lfsr输出m序列c语言,第2章流密码(LFSR)
  5. Ubuntu Linux笔记本屏幕背光亮度调节 (转)
  6. 企业IT信息化战略规划(附下载)
  7. 基于USBASP给AVR单片机烧写Arduino bootloader和application固件
  8. 使用Selenium+PhantomJS抓取腾讯动漫漫画图链接
  9. 推荐最好的四款Linux/BSD防火墙
  10. Fresco-FaceBook推出的Android图片加载库