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

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

[复制链接]
拉肚肚 发布时间:2015-9-4 11:14
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑
. E( [/ S3 `2 u1 z( r. `
2 I. [' c6 I; v8 E# `) t6 Z我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。
+ S: V0 G, _5 i. {(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
9 G$ F" [( I* G* M2 s! g4 G(3) 将int型变量a的第k位清0,即a=a&~(1<<k)
) a' O0 Y+ u2 M8 V# _(4) 将int型变量a的第k位置1, 即a=a|(1<<k)
+ e7 G/ V6 U9 \2 L! p(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 的平均值
# }9 Y- {3 x* y7 e: Z3 S0 C{   
2 t2 M- k) ~5 m' {3 _: k! a     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的幂
6 G, C1 M  t/ L! P- D; nboolean 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);
. z/ e; i2 b9 O" F}
. V& d! t" Y6 u7 N6 d) s7 F(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;
9 u, y. u+ u3 X% X! i    y ^= x;
0 I" J4 M  @( H    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 )
% Q5 F* V: ?) Y  @7 R* @1 G{7 M/ J( R9 ~6 T# X2 ?
  int y ;
3 v5 ^/ j0 d! W' _  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)乘法运算转化成位运算 (在不产生溢出的情况下)
% E1 {! u) e" \      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
  M: Q& @+ X; f( W, N" q(14) a % 2 等价于 a & 1      
/ q2 I( \- n1 A% }) x(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)
! J4 E* o; E& s3 H; w5 N: p' x7 u# s- A% K) `5 ~5 w

- b% ^- |$ q0 j3 n1 v4 }* W
3 _- h1 \' t& A- w9 e& \

  G5 K9 `& h6 e$ T( Z. b. g# H//设置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)
7 j% ?  }  i! j) D  ]& ?//打印x的值
- R1 j8 E. ^5 u2 p, R#define print(x) printf("%dn",x)
* ?4 I# W% e. \- u2 p//将整数(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))
% z  ^& g# k& w; M" M& m#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
{   
+ L6 @' J0 G" V5 W    return (x&y)+((x^y)>>1);2 `0 A. w& r4 }) S, k& _
}
% x3 F. h6 x+ p. }" O4 l3 G' t//判断a是否为2的幂次数7 s# B' j/ B9 Y- p
bool power2(int x)& y. F6 q% B1 M1 x* I' M2 x
{
$ ?+ n$ Y2 j! r. m    return ((x&(x-1))==0)&&(x!=0);+ c% n& a# h% T
}) v8 e8 ?0 E5 Y9 W7 ]# b* n
//x与y互换
5 q9 M! p+ f4 \: Avoid swap(int& x , int& y)5 d6 d5 a3 h9 E7 y4 \
{
, ]3 e% N  Z1 O: C' z# r* j+ P2 q2 M     x ^= y;  N. K8 R, U0 A5 w/ |( @' z7 Y
     y ^= x;
8 i) [8 ^/ c. u     x ^= y;+ i3 B2 H# J+ |- G# [( U, F' [$ T
}# M4 i5 J9 Y! p1 b  g
收藏 6 评论16 发布时间:2015-9-4 11:14

举报

16个回答
拉肚肚 回答时间:2015-9-4 11:36:10
creep 发表于 2015-9-4 11:25
7 p- b& r  v& _7 H5 h2 q8 @. R感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。
  J6 z0 C" _: F0 @# y4 |
已经修改
拉肚肚 回答时间:2015-9-5 09:38:46
alvin_ 发表于 2015-9-5 09:35& Z% [  \( E* z( L- I
不错,以前确实没这么用过
' v9 d+ S7 Y* C8 `1 ]+ }/ w
谢谢回贴,顺带我也刷下回复金币
拉肚肚 回答时间:2015-9-4 19:08:58
JackieLaura 发表于 2015-9-4 15:487 }8 c2 N4 t* \9 t2 @' G. C
而且还是同一个帖子
0 D6 A6 H% s. ]8 x% L
哈哈 那么关注我
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
又看到你了8 _" P: d7 t' E
stmcu.org.png
JackieLaura 回答时间:2015-9-4 15:48:19
而且还是同一个帖子5 _& r% }; d) \6 I5 ]4 U. K
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
2 s' e5 }% n4 e0 \, j$ c6 p确实很实用啊

* Y0 N9 ^# U6 f6 h4 g# ~; g) r嗯嗯
ROCK0525 回答时间:2015-9-5 09:52:31
谢谢楼主分享!
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版