文章来源: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. PIL图像处理:旋转图像
  2. Provider 错误 '80004005' 未指定的错误 的最终解决方法
  3. linux版本FTP下载
  4. java中attribute用法_Java FieldPosition getFieldAttribute()用法及代码示例
  5. Android重力感应示例
  6. 北理工远程教育在线作业统考计算机,北理工19春《操作系统》在线作业【标准答案】...
  7. sklearn库的学习入门
  8. ecshop 源码分析
  9. sql sever如何进行英文词频统计_英语语料库及词频表介绍
  10. Spring Aop 报错 ...but was actually of type 'com.sun.proxy.$Proxy**'的解决方案
  11. A计划 骑士救公主迷宫
  12. Newoupui-pak配置失败怎么处理?
  13. 【内核笔记】博文2021回顾-2022规划
  14. oracle创建索引指定用户,循序渐进学Oracle之索引、权限、角色
  15. 解决报错:did not contain a valid NDK and couldn‘t be used
  16. 织梦系统(DEDECMS)后台模板修改一
  17. 怎么将本地做好的网站部署到服务器上?
  18. 计算机中真值的概念,真值和机器数概念
  19. 阿里云OSS图片存储跨域配置 OSS CDN跨域配置截图
  20. [转] 给网站上传的图片盖章

热门文章

  1. melogin.cn主页登录_手机怎么进melogin.cn登陆页面
  2. android 单元测试 assert,android单元测试AndroidTestCase
  3. Android单元测试网络请求问题
  4. Java使用RSA的公钥加密,私钥解密;私钥加密,公钥解密
  5. 上传自己库到Cocoapods和遇见的各种问题解决
  6. 浅谈一下单片机的定时器功能
  7. SG函数入门HDU 1848
  8. 继电器原理 multisim连线
  9. java 数组的长度如何增加,用Java动态增加任意类型数组的长度
  10. Jmeter 如何用.jtl报告生成HTML报告