C51位运算应用技巧
来源:互联网 发布:求最小公倍数算法 编辑:程序博客网 时间:2023/09/26 10:24
清零取位要用与,某位置一可用或,若要取反和交换,轻轻松松用异或!
移位运算要点
1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
位运算符的应用 (源操作数s 掩码mask)
(1) 按位与-- &
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
(2) 按位或-- |
(3) 位异或-- ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)
a=a1^b1
b=a1^b1^b1
a=b1^a1^a1
二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-
-(~x) = x+
~(-x) = x-
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y:
x!=y:
x< y:
x<=y:
x< y:
x<=y:
应用举例
(1) 判断int型变量a是奇数还是偶数
a&1
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&
(3) 将int型变量a的第k位清0,即a=a&~(1<<k)
(4) 将int型变量a的第k位置1, 即a=a|(1<<k)
(5) int型变量循环左移k次,即a=a<<k|a>>16-k
(6) int型变量a循环右移k次,即a=a>>k|a<<16-k
(7)整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y)
{
}
(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
boolean power2(int x)
{
}
(9)不用temp交换两个整数
void swap(int x , int y)
{
}
(10)计算绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ;
}
(11)取模运算转化成位运算 (在不产生溢出的情况下):a % (2^n) 等价于 a & (2^n - 1)
(12)乘法运算转化成位运算 (在不产生溢出的情况下):a * (2^n) 等价于 a<< n
(13)除法运算转化成位运算 (在不产生溢出的情况下):a / (2^n) 等价于 a>> n
(14) a % 2 等价于 a & 1
(15) if (x == a) x= b;
等价于 x= a ^ b ^ x;
(16) x 的 相反数表示为 (~x+1)
(17) 实现最低n位为1,其余位为0的位串信息:~(~0 << n)
for(j = 0; ((1 << j) & s) == 0; j++) ;
- C51位运算应用技巧
- 位运算应用技巧
- 位运算应用技巧
- 位运算应用技巧
- 位运算技巧与应用
- C 位运算应用技巧
- 位运算入门应用以及技巧
- 位运算入门应用以及技巧
- 位运算入门应用及技巧
- 位运算的应用与技巧:
- 位运算的应用和技巧
- 位运算应用技巧(给各位对于位运算不知所云的新手们)
- 位运算的技巧
- 位运算(技巧)
- 位运算各种技巧
- 位运算常用技巧
- 位运算 技巧
- 位运算技巧
- Java EE 精萃
- 在Linux下安装JDK及环境设置
- Unity3D修改模型的网格数据
- 常见排序算法稳定性分析
- popen内存不足问题解决办法
- C51位运算应用技巧
- 线程初始化和锁
- 将文件压缩为zip格式
- 反恐精英便携版 Critical Strike Portable
- 对于自己,唯有努力
- 为notepad配置vs环境
- 关于havlenapetr-FFMpeg在Android 4.0(ICS)的补充说明
- 短信猫发送SQL Server数据库和加密狗在VM虚拟机上识别
- 用Java压缩文件后再用web service实现下载传送