
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑 我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。 (1) 判断int型变量a是奇数还是偶数 ; X7 M& P) d* m" t% E2 o7 j a&1 = 0 偶数' ?2 D2 v( ]7 e1 g/ S) L a&1 = 1 奇数% {" o" |8 M+ [: z z4 r (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<<k|a>>16-k (设sizeof(int)=16)6 B; _' J' _( k% G9 d0 c (6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)3 h1 b4 b8 ?2 l4 y5 m& C (7)整数的平均值, j/ r' v3 o/ `. A% C) t4 w* S 对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:) D: p3 n( _+ a8 N int average(int x, int y) //返回X,Y 的平均值 { return (x&y)+((x^y)>>1);. }5 p5 p5 @/ G4 R7 y4 k }. a. o# a7 X; `- `3 f) N* e (8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 boolean power2(int x)4 s. ?1 C# z% L7 r" i. D {! G+ O' y( q% |3 L2 d/ O4 ^! p return ((x&(x-1))==0)&&(x!=0); } (9)不用temp交换两个整数. ]9 Z6 U9 t$ n% U. G' a void swap(int x , int y)- D3 O, b) G7 e {$ h; E: G8 z6 Q4 @" s- G8 z x ^= y; y ^= x; x ^= y;1 Z3 K5 l3 P/ i$ F! F, q. @ }1 d6 L) z1 R+ R* g8 t (10)计算绝对值* }: f: I$ X; U Y! M0 \# L int abs( int x ) {7 M/ J( R9 ~6 T# X2 ? int y ; y = x >> 31 ;$ v8 p5 A2 ?# G1 j return (x^y)-y ; //or: (x+y)^y6 g4 ~4 D8 f$ J/ G$ M }9 z; M6 u( o) [# e! {/ N (11)取模运算转化成位运算 (在不产生溢出的情况下)% i$ i# V# u" r: n; S a % (2^n) 等价于 a & (2^n - 1)5 r# I* {# f( ^( t/ ~7 }3 o, Q4 F (12)乘法运算转化成位运算 (在不产生溢出的情况下) a * (2^n) 等价于 a<< n# }8 ]/ d5 Z: G# R (13)除法运算转化成位运算 (在不产生溢出的情况下)4 d% s5 V- n- P4 a5 l) G0 ~ a / (2^n) 等价于 a>> n8 s5 o0 K9 z; O 例: 12/8 == 12>>3 (14) a % 2 等价于 a & 1 (15) if (x == a) x= b;9 \1 p' U7 o7 e! b else x= a; 等价于 x= a ^ b ^ x;( I K" N4 ?, i0 { (16) x 的 相反数 表示为 (~x+1) 7 u# s- A% K) `5 ~5 w //设置x的第y位为1/ O a/ }; R1 D) [+ l% N) a #define setbit(x,y) (x)|=(1<<(y-1))( ^' u6 E' r9 E k //得到x的第y位的值/ U( y7 i8 h0 C& g5 O #define BitGet(Number,pos) ((Number)>>(pos-1)&1) //打印x的值 #define print(x) printf("%dn",x) //将整数(4个字节)循环右移动k位) r+ U1 T! n* D5 d$ `5 J #define Rot(a,k) ((a)<<(k)|(a)>>(32-k))3 I7 \+ B; W7 y3 Q5 s5 r //判断a是否为2的幂次数( D0 \/ k K! c. X8 r* X# t #define POW2(a) ((((a)&(a-1))==0)&&(a!=0)) #define OPPX(x) (~(x)+1)+ u# ]. w! T# |& ?# M2 Q8 L& ] //返回X,Y 的平均值! |+ r. q( S& m. J: |* n# y int average(int x, int y)2 |. k7 g2 G! Z+ Z' `% n3 h { return (x&y)+((x^y)>>1);2 `0 A. w& r4 }) S, k& _ } //判断a是否为2的幂次数7 s# B' j/ B9 Y- p bool power2(int x)& y. F6 q% B1 M1 x* I' M2 x { return ((x&(x-1))==0)&&(x!=0);+ c% n& a# h% T }) v8 e8 ?0 E5 Y9 W7 ]# b* n //x与y互换 void swap(int& x , int& y)5 d6 d5 a3 h9 E7 y4 \ { x ^= y; N. K8 R, U0 A5 w/ |( @' z7 Y y ^= x; x ^= y;+ i3 B2 H# J+ |- G# [( U, F' [$ T }# M4 i5 J9 Y! p1 b g |
已经修改
谢谢回贴,顺带我也刷下回复金币
哈哈 那么关注我
嗯嗯