[算法设计] 经典的位运算实例

[复制链接]
盛坚 2013-11-10 23:51:14
1) int型变量循环左移k次,即a=a < <k |a>>16-k (设sizeof(int)=16) 1 b/ V0 |- m* w2 k' x$ @
(2) int型变量a循环右移k次,即a=a>>k |a < <16-k (设sizeof(int)=16)
# Z( _! T! Z$ b9 P1 N(3)整数的平均值
8 [; A" c1 p* H) t# t5 r! |对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法: 0 G) l' Z% G1 w! q8 m: Y1 B
int average(int x, int y) //返回X,Y 的平均值
3 Z6 S" C' f9 a{
; H1 w7 c1 b$ a, M3 a return (x&y)+((x^y)>>1); . t0 d. f" L8 R6 f3 n' y
} + ]/ Q, X" t( K' I( W% I/ j* {
(4)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 ) P8 W6 s8 b1 D
boolean power2(int x)
6 p1 {" H. m3 B& u/ {
% y" ^" d7 I4 @8 } return ((x&(x-1))==0)&&(x!=0); 7 {! `" U' ^* i8 S" h" r* |1 n
} 0 W, o4 Z& Q- C; y2 N
(5)不用temp交换两个整数
8 _- B9 B9 ~4 q7 l# k7 c& H: rvoid swap(int x , int y)
& d+ `1 s9 k0 n4 X" h* Y/ m6 _3 c{ 7 E+ `( F4 n/ p$ O+ e
x ^= y;
- {- f2 K& e% i% z1 j y ^= x;
/ O) Z3 m! k/ l* } x ^= y; ! g) j/ b, T' C! d9 z+ P
} 9 F/ _+ A* n$ u; z
(6)计算绝对值 $ `1 u }' L, A7 k2 j( D$ F
int abs( int x )
# o5 q o3 `5 n7 " x5 E9 l. V{ * N- L/ L6 h& e
int y ; ~1 n0 P! z) q/ x7 Z
y = x >> 31 ; ) I$ u, u' L1 ^: [
return (x^y)-y ; //or: (x+y)^y : F/ d+ e9 ]2 C+ _2 @
} # }9 d7 }3 e# D, [% `( R( C
(7)取模运算转化成位运算 (在不产生溢出的情况下) 5 u) a7 N* Q: r5 h6 ]" F; R
a % (2^n) 等价于 a & (2^n - 1)
: R7 k6 f' j0 M6 u2 r(8)乘法运算转化成位运算 (在不产生溢出的情况下)
7 A: ^' |+ {! X1 j, T a * (2^n) 等价于 a < < n
2 O/ [1 ^6 o" j(9)除法运算转化成位运算 (在不产生溢出的情况下) 6 ^9 B% ]1 w S7 r ]: c" t
a / (2^n) 等价于 a>> n # Y. t( G' Z4 C
例: 12/8 == 12>>3
/ I/ J- f: j. Y+ B(10) a % 2 等价于 a & 1
4 - O' H* I- e- g(11) if (x == a) x= b;
; Y( G% x1 j, d; {   else x= a;
! `3 j( K) K9 K   等价于 x= a ^ b ^ x; 8 x7 k. S; j1 `- G1 B- x5 @6 y
(12) x 的 相反数 表示为 (~x+1) (13)求从x位(高)到y位(低)间共有多少个1
' b+ w% V b: Ipublic static int FindChessNum(int x, int y, ushort k) . M6 x7 E0 l) w t6 t1 o( _
{ / [4 b, i) V3 x. x7 H& Q' i4 v
int re = 0; : a. w c0 [+ m" B0 @
for (int i = y; i <= x; i++) 6 u5 S) Y1 N; d
{ 9 c; ~4 z p. p W5 X
re += ((k >> (i - 1)) & 1); 2 F: J( u$ P* A9 v$ L
} ' I4 v' B( A$ `/ F
return re; ; r- M3 H; p4 v7 ^7 h2 c
} X8 V% @, O8 {5 @5 u(
(14); Q: w+ E% p/ o: l) D
/*将32位数分解为4个8位数处理后再合成32位数返回*/
2 u* , x1 K/ ^DWORD GetDW(DWORD dw)5 Z/ x1 x3 R5 r# {8 R
{4 h' T( |) K3 T( Q d+ m
DWORD dwRet=0;& e# _+ O8 ?6 R7 z8 `# V9 j4 S( [
if (dw!=0)
* N' J3 w7 j5 G! E c. F1 ? {1 u! l0 T7 J6 x) G7 b+ ]0 g# N1 }( w
BYTE b1=(dw>>24)&0xff,b2=(dw>>16)&0xff,b3=(dw>>8)&0xff,b4=dw&0xff;" _1 P# N% ~! T5 K+ v& x
//分别处理 b1,b2,b3,b4
" H, j1 l7 B# W1 J dwRet=b1;. W( Q6 g9 b! c( U
dwRet=(dwRet<<8)+b2;
- ]& H6 P1 ; @0 S6 Y dwRet=(dwRet<<8)+b3;- L, d: G% y% ~$ b! o* j
dwRet=(dwRet<<8)+b4;
$ ?7 ^$ w e5 ~2 r) b [: z' O return dwRet;* B, c! a5 S, L0 H
}8 k& t2 i% U5 e4 S% t* Y
else{
8 H' a1 u4 M9 b6 V) T return 0;
% q* I9 b: k. X- { }, B2 {7 i7 _4 b% z7 a3 i
}
言艳芳 2013-11-11 01:24:46
秀起来~
回复

使用道具 举报

相佁然 2013-11-11 01:39:56
LZ敢整点更有创意的不?兄弟们等着围观捏~
回复

使用道具 举报

宗政优悦 2013-11-11 04:01:05
嘘,低调。
回复

使用道具 举报

携手共进 2013-11-11 04:52:27
是爷们的娘们的都帮顶!大力支持
回复

使用道具 举报

左萍韵 2013-11-11 06:17:45
撸过
回复

使用道具 举报

吕晏静 2013-11-11 10:30:39
打酱油的人拉,回复下赚取积分
回复

使用道具 举报

单于力 2013-11-11 12:23:52
支持,楼下的跟上哈~
回复

使用道具 举报

甘叶吉 2013-11-11 14:19:02
路过
回复

使用道具 举报

乐观 2013-11-12 01:09:27
嘘,低调。
回复

使用道具 举报

羊晏静 2013-11-12 01:21:03
发发呆,回回帖,工作结束~
回复

使用道具 举报

太叔樱花 2024-10-17 09:43:02
前排支持下了哦~
回复

使用道具 举报

巴妍 2024-12-20 08:58:25
我是个凑数的。。。
回复

使用道具 举报

敖柔煦 2024-12-28 21:06:01
佩服佩服!
回复

使用道具 举报

那安娴 2025-3-31 22:52:10
好,很好,非常好!
回复

使用道具 举报

田海书 2025-4-2 18:30:01
好,很好,非常好!
回复

使用道具 举报

全雪戈 2025-5-18 15:38:47
顶起顶起顶起
回复

使用道具 举报

手机版

GMT+8, 2025-5-30 11:23

Copyright © 2012 技术派 | 技术支持:技术派设计

Powered by Discuz! X3.4