|
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑 我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。6 d8 e5 t% Z, L2 ]6 e$ } (1) 判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 (2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1, n% F7 y' x( x) @5 o. j/ ?( D (3) 将int型变量a的第k位清0,即a=a&~(1<<k)3 {& J* O) T' {' T8 Y (4) 将int型变量a的第k位置1, 即a=a|(1<<k)" f$ |1 p7 ]1 d* i6 H4 K (5) int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)0 s* x8 a6 O6 C% ]% C (6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16) (7)整数的平均值 对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:, m, }& }. l3 b: E) [4 a0 z0 E int average(int x, int y) //返回X,Y 的平均值1 R+ f+ a/ C8 M7 \ { 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) R6 q5 Y6 Y/ z4 a" K { x ^= y; y ^= x;3 d; S% \$ R8 U x ^= y;& p- i/ j* I( `5 I }- S7 F4 s8 w+ W' f" e' o" E ?, \ (10)计算绝对值 int abs( int x )5 Y' T' X, K% R3 I* h" u+ { {+ q( a: J- S' o3 b# Q# G int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y7 b+ Q8 b% M! h } (11)取模运算转化成位运算 (在不产生溢出的情况下)' M; Z( b- r4 G2 _& @' T, n 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 8 A) g/ l3 J5 y) z# d# X; @- T (15) if (x == a) x= b; else x= a; 等价于 x= a ^ b ^ x;5 f! g3 V5 }- g; R6 f (16) x 的 相反数 表示为 (~x+1) {6 I0 S7 P! f& c' G & O5 p: z2 c+ m% f* W7 \ //设置x的第y位为1 #define setbit(x,y) (x)|=(1<<(y-1))! m+ J4 T4 O8 Y9 p3 ]% e" e7 {/ w( j //得到x的第y位的值% }! W3 p) z8 g6 ?+ R1 X ? #define BitGet(Number,pos) ((Number)>>(pos-1)&1) //打印x的值 #define print(x) printf("%dn",x) //将整数(4个字节)循环右移动k位 #define Rot(a,k) ((a)<<(k)|(a)>>(32-k))0 ?' F7 \+ Q9 A! o C: Y% q //判断a是否为2的幂次数0 c& e: A- o1 u9 `+ m, B% T6 [ #define POW2(a) ((((a)&(a-1))==0)&&(a!=0))) k: t# k H1 |- | #define OPPX(x) (~(x)+1) //返回X,Y 的平均值 int average(int x, int y) { return (x&y)+((x^y)>>1);3 K" I! C; W, ~+ ^, @" \" j }3 }, R- E. B/ Y+ w/ p/ ?/ ]6 m) I1 w5 W //判断a是否为2的幂次数. S1 F3 l# R& ~1 S3 W, b bool power2(int x)3 \* ` |0 W. s" X) L; ]4 o4 |$ R* J { return ((x&(x-1))==0)&&(x!=0); }/ }! ^0 k3 R- A' l! s) o# L4 R //x与y互换 void swap(int& x , int& y) {) C& a2 W4 ]4 e1 m5 j x ^= y; y ^= x;' i- z+ t# {$ }1 ~2 T x ^= y;' u; G4 c! J$ H8 b/ o! X, b, n }% l Q, Q! @/ o9 q |
微信公众号
手机版
已经修改
谢谢回贴,顺带我也刷下回复金币
哈哈 那么关注我
嗯嗯