博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位运算的运用
阅读量:6319 次
发布时间:2019-06-22

本文共 1889 字,大约阅读时间需要 6 分钟。

  hot3.png

(1) 判断int型变量a是奇数还是偶数

a&1 = 0 偶数
a&1 = 1 奇数
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 将int型变量a的第k位清0,即a=a&~(1 < <k)
(4) 将int型变量a的第k位置1, 即a=a|(1 <<k)
(5) int型变量循环左移k次,即a=a < >16-k (设sizeof(int)=16)
(6) int型变量a循环右移k次,即a=a>>k|a < <16-k (设sizeof(int)=16)
(7)整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y) //返回X,Y 的平均值
{
return (x&y)+((x^y)>>1);
}
(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
boolean power2(int x)
{
return ((x&(x-1))==0)&&(x!=0);
}
(9)不用temp交换两个整数
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
(10)计算绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
(11)取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a & (2^n – 1)
(12)乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a < < n
(13)除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 a>> n
例: 12/8 == 12>>3
(14) a % 2 等价于 a & 1
(15) if (x == a) x= b;
else x= a;
等价于 x= a ^ b ^ x;
(16) x 的 相反数 表示为 (~x+1)

实例

功能 | 示例 | 位运算

———————-+—————————+——————–
去掉最后一位 | (101101->10110) | x >> 1
在最后加一个0 | (101101->1011010) | x < < 1
在最后加一个1 | (101101->1011011) | x < < 1+1
把最后一位变成1 | (101100->101101) | x | 1
把最后一位变成0 | (101101->101100) | x | 1-1
最后一位取反 | (101101->101100) | x ^ 1
把右数第k位变成1 | (101001->101101,k=3) | x | (1 < < (k-1))
把右数第k位变成0 | (101101->101001,k=3) | x & ~ (1 < < (k-1))
右数第k位取反 | (101001->101101,k=3) | x ^ (1 < < (k-1))
取末三位 | (1101101->101) | x & 7
取末k位 | (1101101->1101,k=5) | x & ((1 < < k)-1)

取右数第k位 | (1101101->1,k=4) | x >> (k-1) & 1

把末k位变成1 | (101001->101111,k=4) | x | (1 < < k-1)

末k位取反 | (101001->100110,k=4) | x ^ (1 < < k-1)
把右边连续的1变成0 | (100101111->100100000) | x & (x+1)
把右起第一个0变成1 | (100101111->100111111) | x | (x+1)
把右边连续的0变成1 | (11011000->11011111) | x | (x-1)
取右边连续的1 | (100101111->1111) | (x ^ (x+1)) >> 1
去掉右起第一个1的左边 | (100101000->1000) | x & (x ^ (x-1))
判断奇数 (x&1)==1
判断偶数 (x&1)==0

转载于:https://my.oschina.net/jeeker/blog/424797

你可能感兴趣的文章
在以太坊上如何取消/修改已经提交的交易
查看>>
Android IOS WebRTC 音视频开发总结(十九)-- kurento
查看>>
reshape2 数据操作 数据融合( cast)
查看>>
第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)
查看>>
八、主从复制
查看>>
深入理解RunLoop 整理资料
查看>>
俄罗斯方块
查看>>
LabVIEW将字符串转化为十进制
查看>>
欢迎光临
查看>>
20131205
查看>>
数组相减
查看>>
【poj 1962】Corporative Network(图论--带权并查集 模版题)
查看>>
使用AngularJS学习MVC的基础知识分享
查看>>
UDP template 代码
查看>>
爬虫 高性能
查看>>
使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(二)
查看>>
干吧跌!~brothers!~~
查看>>
linux 0.11 源码学习(七)
查看>>
函数模板的简单用法
查看>>
利用 LINQ的skip和Take 方法对List实现分页效果
查看>>