|
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑 1 b# e# _' R6 k# i# e1 l8 ? 2 a+ F1 G* A" ^ K 我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。 (1) 判断int型变量a是奇数还是偶数 # d! g, x: V+ G3 M$ z3 M0 M a&1 = 0 偶数 a&1 = 1 奇数4 Y8 _) L' M* i$ q+ { (2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (3) 将int型变量a的第k位清0,即a=a&~(1<<k)) B6 g; R7 X1 j: Z0 B/ b3 F1 \0 e (4) 将int型变量a的第k位置1, 即a=a|(1<<k), x# h6 Q% {% [" r& q! K4 v' `8 ` (5) int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)4 g: t7 w( b o! c (6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16) (7)整数的平均值& C* T3 D! c4 o" j: U" {( c 对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:" e1 J; w) [2 p# V int average(int x, int y) //返回X,Y 的平均值. v+ n0 v Z( J1 c7 H* O6 | { + w, B* J6 |3 t return (x&y)+((x^y)>>1);5 m1 m) `( d4 d; H9 F& S3 t% L( R2 G7 A } (8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 boolean power2(int x) {0 B! o+ i/ Q8 S% p: W' D( F return ((x&(x-1))==0)&&(x!=0); }/ \+ N2 [& H! m$ v7 E2 W% g. p (9)不用temp交换两个整数+ \- l$ i9 r, C" D. G void swap(int x , int y) {/ Y$ V# R* p$ ^8 T p: k x ^= y;, g2 _6 E& M( q) Y1 r% `4 ] y ^= x; x ^= y;1 A% }9 b, \6 F: t5 N' f } (10)计算绝对值 int abs( int x )+ i7 ?' X: i ]; _ { int y ;; u+ B3 `) I# ~5 j y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y }+ y/ B3 ~$ P2 H' U% B7 l" O! H (11)取模运算转化成位运算 (在不产生溢出的情况下)6 q* e5 w+ v5 s( P# b a % (2^n) 等价于 a & (2^n - 1) (12)乘法运算转化成位运算 (在不产生溢出的情况下)/ F& h9 }3 f0 D- w& W7 r) A$ ~ a * (2^n) 等价于 a<< n5 Y p6 f: D( d (13)除法运算转化成位运算 (在不产生溢出的情况下) a / (2^n) 等价于 a>> n) f! m8 U' h2 \$ g. ] 例: 12/8 == 12>>3$ S' D# ?# c6 y% I (14) a % 2 等价于 a & 1 9 K: p+ F' u3 r/ Z$ p9 ` (15) if (x == a) x= b;0 H, v/ F) T! R& E( }: }8 e7 { else x= a; 等价于 x= a ^ b ^ x; (16) x 的 相反数 表示为 (~x+1)9 Z7 S( _: ^, D5 [5 [ 7 B9 z5 Y, S1 J# c- }0 i" n: ? ) @# R/ f% |1 t" p //设置x的第y位为1 #define setbit(x,y) (x)|=(1<<(y-1))+ C5 v& D4 o# k9 e7 |3 r! c4 A //得到x的第y位的值, J$ t6 r6 c+ H& S #define BitGet(Number,pos) ((Number)>>(pos-1)&1) //打印x的值) L" l: w& @* |+ l/ [8 ?* S #define print(x) printf("%dn",x); _; B2 G2 l" h! v, f% {3 F //将整数(4个字节)循环右移动k位 #define Rot(a,k) ((a)<<(k)|(a)>>(32-k)) //判断a是否为2的幂次数 #define POW2(a) ((((a)&(a-1))==0)&&(a!=0)) #define OPPX(x) (~(x)+1)# O# Y9 b4 p& u+ \# z4 i* ` //返回X,Y 的平均值 int average(int x, int y) { return (x&y)+((x^y)>>1);4 L! d$ W8 k; N3 B }1 {- ~/ w) c2 u8 Q6 C //判断a是否为2的幂次数 bool power2(int x). U" f) [+ p5 A0 E {% v7 L! D* Y' G8 F return ((x&(x-1))==0)&&(x!=0); } //x与y互换 b% r: N8 t0 A2 L1 q; l0 w2 k: N void swap(int& x , int& y); I# A! g7 H4 g3 q {6 Z! {& z& D& \4 m8 |3 f x ^= y; y ^= x; x ^= y; }- N1 b: G8 ~6 Y7 ]! }2 U. ?5 L |
微信公众号
手机版
已经修改
谢谢回贴,顺带我也刷下回复金币
哈哈 那么关注我
嗯嗯