你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【肚肚分享】巧用c语言位运算

[复制链接]
拉肚肚 发布时间:2015-9-4 11:14
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑 1 b# e# _' R6 k# i# e1 l8 ?
2 a+ F1 G* A" ^  K
我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。
7 Q/ j8 m2 S/ n' v% u(1) 判断int型变量a是奇数还是偶数           # d! g, x: V+ G3 M$ z3 M0 M
  a&1   = 0 偶数
$ d& ]5 B" h4 x+ n5 [6 J  K7 I  a&1   = 1 奇数4 Y8 _) L' M* i$ q+ {
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
+ [) B" f/ a+ N. [# {6 F- v(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)
+ p5 a4 d+ ^+ ~! b) X! }(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
}
' V7 Y2 I$ B' ^) z(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
( \4 v7 a) ^/ nboolean power2(int x)
3 j. W* I5 ]$ S1 X: }4 I( Q) l8 q: s{0 B! o+ i/ Q8 S% p: W' D( F
    return ((x&(x-1))==0)&&(x!=0);
# j/ E+ O) v% Y. @1 z7 E) g2 i}/ \+ N2 [& H! m$ v7 E2 W% g. p
(9)不用temp交换两个整数+ \- l$ i9 r, C" D. G
void swap(int x , int y)
. h, E' ]8 q/ I% B9 s6 A{/ Y$ V# R* p$ ^8 T  p: k
    x ^= y;, g2 _6 E& M( q) Y1 r% `4 ]
    y ^= x;
! {% V4 {' G! t    x ^= y;1 A% }9 b, \6 F: t5 N' f
}
& J2 z' Q  i9 w5 ^' Q3 ^(10)计算绝对值
; o7 @# U; x& p- Gint abs( int x )+ i7 ?' X: i  ]; _
{
- S/ H* \& w0 q. n  int y ;; u+ B3 `) I# ~5 j
  y = x >> 31 ;
+ p6 ], s3 I" U; o8 h; Q, g5 d& L1 J  return (x^y)-y ;        //or: (x+y)^y
; z2 E8 O( X7 J}+ 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)
- x1 }' i0 W; S3 X6 p(12)乘法运算转化成位运算 (在不产生溢出的情况下)/ F& h9 }3 f0 D- w& W7 r) A$ ~
      a * (2^n) 等价于 a<< n5 Y  p6 f: D( d
(13)除法运算转化成位运算 (在不产生溢出的情况下)
) ~/ _' _) C5 B' b! b& B: \, T  G      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;
4 Y: w; p1 G2 l- a/ G(16) x 的 相反数 表示为 (~x+1)9 Z7 S( _: ^, D5 [5 [
7 B9 z5 Y, S1 J# c- }0 i" n: ?

3 d/ N" n; A% G: u0 W( ]) @# R/ f% |1 t" p

& M; z  `, K. m//设置x的第y位为1
9 p* O8 E3 u% A5 |8 x#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)
; u/ n  k  G& w( l  e" |//打印x的值) L" l: w& @* |+ l/ [8 ?* S
#define print(x) printf("%dn",x); _; B2 G2 l" h! v, f% {3 F
//将整数(4个字节)循环右移动k位
  H7 S' \! M' x9 Q2 C% i" I#define Rot(a,k) ((a)<<(k)|(a)>>(32-k))
3 W& Z5 a6 O* {//判断a是否为2的幂次数
: J9 p; Z: `2 W! F1 N#define POW2(a) ((((a)&(a-1))==0)&&(a!=0))
9 J8 _1 F# g6 \% @% p#define OPPX(x) (~(x)+1)# O# Y9 b4 p& u+ \# z4 i* `
//返回X,Y 的平均值
: {+ o: M4 m" b$ pint average(int x, int y)
; t( g* ~9 Z7 ^8 O{   
0 q  k1 n5 |4 d9 ?" q" `8 k2 r( b+ y    return (x&y)+((x^y)>>1);4 L! d$ W8 k; N3 B
}1 {- ~/ w) c2 u8 Q6 C
//判断a是否为2的幂次数
: r1 _: k# J1 m, R6 q8 dbool power2(int x). U" f) [+ p5 A0 E
{% v7 L! D* Y' G8 F
    return ((x&(x-1))==0)&&(x!=0);
  n" N- W' Y) d( u  o}
7 b* _; ~2 e: I6 O; ~//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;
7 Z9 `! i% l/ M# i4 K     y ^= x;
0 a9 f7 A2 i" w6 w1 R* V     x ^= y;
1 f+ l3 f% h" C" e}- N1 b: G8 ~6 Y7 ]! }2 U. ?5 L
赞 收藏 6 评论16 发布时间:2015-9-4 11:14

举报

16个回答
拉肚肚 回答时间:2015-9-4 11:36:10
creep 发表于 2015-9-4 11:25* ?1 c5 E/ G- G3 e; x0 L0 T9 u% H& T& m
感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。

6 w* h9 T; m3 D7 }$ x. Y/ o已经修改
拉肚肚 回答时间:2015-9-5 09:38:46
alvin_ 发表于 2015-9-5 09:35
; [" a7 {) A7 ]/ Z不错,以前确实没这么用过

3 B; I& k3 ?- H谢谢回贴,顺带我也刷下回复金币
拉肚肚 回答时间:2015-9-4 19:08:58
JackieLaura 发表于 2015-9-4 15:48
" w4 K3 `4 _- o- e而且还是同一个帖子

9 }3 N' E$ j4 N% B) e* c哈哈 那么关注我
creep 回答时间:2015-9-4 11:25:45
感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。
mark0668 回答时间:2015-9-4 11:33:50
感谢分享
你好我好大家好! 回答时间:2015-9-4 12:32:09
不错不错
JackieLaura 回答时间:2015-9-4 15:47:29
又看到你了
- t4 t* n* @) |/ f) ^; Y+ m
stmcu.org.png
JackieLaura 回答时间:2015-9-4 15:48:19
而且还是同一个帖子/ a' F& O& z0 b6 S7 S% o% j
stmcu.org.png
风子 回答时间:2015-9-4 16:05:37
呵呵,谢谢分享
alisa123 回答时间:2015-9-4 19:04:55
谢谢楼主分享!
wyxy163@126.com 回答时间:2015-9-5 09:25:48
提示: 作者被禁止或删除 内容自动屏蔽
alvin_ 回答时间:2015-9-5 09:35:37
不错,以前确实没这么用过
拉肚肚 回答时间:2015-9-5 09:37:44
数码小叶 发表于 2015-9-5 09:25
0 K- |. o! q. `# q/ w& F1 l5 E确实很实用啊

) Y  D" D4 t3 V& h8 _2 x, Y1 [嗯嗯
ROCK0525 回答时间:2015-9-5 09:52:31
谢谢楼主分享!
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版