位运算的运用
2015-03-12 15:04
218 查看
搜集自网络
判断int型变量a是奇数还是偶数
取int型变量a的第k位 (k=0,1,2……sizeof(int))
将int型变量a的第k位清0
将int型变量a的第k位置1
int型变量循环左移k次,
int型变量a循环右移k次,
整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
对于一个数 x >= 0,判断是不是2的幂。
不用temp交换两个整数
计算绝对值
取模运算转化成位运算 (在不产生溢出的情况下)
乘法运算转化成位运算 (在不产生溢出的情况下)
除法运算转化成位运算 (在不产生溢出的情况下)
例:
a % 2 等价于
简单的if else
x 的 相反数 表示为
输入2的n次方:
乘除2的n倍:乘
判断int型变量a是奇数还是偶数
a&1 = 0 偶数 a&1 = 1 奇数
取int型变量a的第k位 (k=0,1,2……sizeof(int))
a>>k&1 (先右移再与1)
将int型变量a的第k位清0
a=a&~(1<<k) (10000 取反后为00001 )
将int型变量a的第k位置1
a=a|(1<<k)
int型变量循环左移k次,
a=a<<k|a>>16-k (设sizeof(int)=16)
int型变量a循环右移k次,
a=a>>k|a<<16-k (设sizeof(int)=16)
整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y) //返回X、Y的平均值 { return (x & y) + ( (x^y)>>1 ); }
对于一个数 x >= 0,判断是不是2的幂。
boolean power2(int x) { return ( (x&(x-1))==0) && (x!=0); }
不用temp交换两个整数
void swap(int x , int y) { x ^= y; y ^= x; x ^= y; }
计算绝对值
int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y }
取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a & (2^n - 1)
乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a<< n
除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 a>> n
例:
12/8 == 12>>3
a % 2 等价于
a & 1
简单的if else
if (x == a) x= b; else x= a; 等价于 x= a ^ b ^ x;
x 的 相反数 表示为
(~x+1)
输入2的n次方:
1 << n
乘除2的n倍:乘
a << n, 除
a >> n
相关文章推荐
- C语言位运算运用二:输出二进制序列中所有的偶数位和奇数位
- 码农小汪剑指Offer之38-数组中只出现一次的数字 异或运算的运用
- 异或运算的经典运用
- zyf的童年(异或运算的运用)
- (转)C#运用位运算进行权限管理
- 运用位运算会比较简单 Binary Numb…
- 两个位运算运用到搜索中的问题
- (转)巧妙运用C语言位运算
- Oracle 中运用rollup和cube实现汇总运算
- 简易运算 (运用封装实现)
- 逻辑运算在Unity中的巧妙运用
- 运用PHP位运算做网站权限
- 栈如何运用在四则运算中(JAVA实现)
- [Java初学] 第一次作业 “回文数”判断 - 运用取余运算
- 异或运算的神奇运用
- 人造奇迹——二进制位运算的运用
- 位运算--权限运用
- 剑指offer--数组中只出现一次的数字--异或运算、二进制运用
- 位运算基础及简单运用
- 运用异或运算实现两个数不通过中间变量交换值的原理分析