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

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

[复制链接]
拉肚肚 发布时间:2015-9-4 11:14
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑 5 ]4 @; Y. I/ [8 z: N7 ~4 x% F

8 J3 m# u5 ?6 Y8 o0 a* Z2 S  r  s我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。: b  I  O. D3 s9 o7 p& u
(1) 判断int型变量a是奇数还是偶数           # T7 n, x* h, ?9 r' d- j
  a&1   = 0 偶数6 f6 h( f- L# S
  a&1   = 1 奇数2 [( q* s* n" \! P  Y) T1 L
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
7 ]" b. K% c1 |(3) 将int型变量a的第k位清0,即a=a&~(1<<k): U# n: \5 q  n' c$ e
(4) 将int型变量a的第k位置1, 即a=a|(1<<k)
8 o8 f5 W& E# K0 v(5) int型变量循环左移k次,即a=a<<k|a>>16-k   (设sizeof(int)=16)$ Z3 m2 M. C. Z& e0 K
(6) int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(int)=16)
0 w$ N" I6 k4 x; F* f/ q- f(7)整数的平均值# m* \& w1 E$ m- W* n
    对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
3 T  J: s# P, q( ~' b, s  t! rint average(int x, int y)   //返回X,Y 的平均值. C1 E: J- f4 o4 w- a' A2 K
{   - J. d% k; L& h5 A
     return (x&y)+((x^y)>>1);# }7 j$ H# v& I: O8 Z
}
4 ]3 b; w! @3 T: \1 w1 C(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂! _; s0 u+ R. b
boolean power2(int x), F  R1 ^6 d! \3 v  f4 m
{+ W0 w" ?$ I9 G, n+ H
    return ((x&(x-1))==0)&&(x!=0);: W/ F3 A) k& F% Y2 d/ K! t
}$ Y! Z. B% o, a1 \6 r  ^# j
(9)不用temp交换两个整数( H, V7 [, h7 n1 R" Y& S% o- D
void swap(int x , int y)9 \3 T; L& a  O; l0 {# l
{1 M* T+ }) D; l8 {$ P! X
    x ^= y;
9 g/ @, H, C1 r+ Y    y ^= x;. \8 c0 p8 ]4 P: u: q
    x ^= y;
$ C) \9 e$ d7 v* e/ m* |; P}2 J9 x3 S. P1 P! T1 Q2 {7 b; g
(10)计算绝对值9 |! u0 `$ \) s3 e) q; s
int abs( int x ), I% J) q: H4 g2 w3 F% M
{. D, F0 t( u4 Q' q1 K( F9 j
  int y ;9 h  p3 W* Z/ p: \1 V- ~- r! W* u* h
  y = x >> 31 ;
% K0 X/ C+ t- F6 `$ u2 }  return (x^y)-y ;        //or: (x+y)^y
* s$ w& B( f3 r* w}
0 G- ]6 b% Q& ]0 F7 H3 j(11)取模运算转化成位运算 (在不产生溢出的情况下): Y& u7 x7 x/ n0 ~/ V2 Y
      a % (2^n) 等价于 a & (2^n - 1)
* w4 s$ F! U/ e  }4 J1 u( Q+ \8 j(12)乘法运算转化成位运算 (在不产生溢出的情况下)
& d  W( n6 l- r      a * (2^n) 等价于 a<< n% h/ G+ U' `3 b; M8 }3 c
(13)除法运算转化成位运算 (在不产生溢出的情况下)
. ?* W+ t+ f- o      a / (2^n) 等价于 a>> n
2 E$ d* |, o: e      例: 12/8 == 12>>3$ h8 e! d& c2 P. D9 O- w7 C9 k0 w
(14) a % 2 等价于 a & 1       ) V" ~& |( \% K! M0 v/ m( d: ^
(15) if (x == a) x= b;4 T7 q4 \% Q% ?' k9 W+ e+ I
   else x= a; 等价于 x= a ^ b ^ x;; E' f0 }% @% w  {, J; F+ \" F
(16) x 的 相反数 表示为 (~x+1)) {+ l. g2 I" T
6 B7 y7 d( E& c% h4 b. J

0 P# U6 _  b% c  O
) {( L% y9 ]6 T9 ?5 K/ M
8 d# n0 P0 M' L* T7 _
//设置x的第y位为1
) D8 Q' u1 R, c- M#define setbit(x,y) (x)|=(1<<(y-1)): M- k# I8 Y6 {/ _, o
//得到x的第y位的值1 a8 w! n7 V* T2 p- @
#define BitGet(Number,pos) ((Number)>>(pos-1)&1)$ J3 C5 @2 k) I
//打印x的值
% C3 E3 j! U, v' I#define print(x) printf("%dn",x)
8 @0 \" n% B9 l//将整数(4个字节)循环右移动k位
  r* b& h& Z4 B9 j  X% V#define Rot(a,k) ((a)<<(k)|(a)>>(32-k))$ `9 [# r" h) ]7 l' o
//判断a是否为2的幂次数1 T' b0 [. w0 W/ y7 ~6 @  u
#define POW2(a) ((((a)&(a-1))==0)&&(a!=0))
* j! `0 g7 c8 U0 J: F" n#define OPPX(x) (~(x)+1)
7 G9 e3 @, ~! P& b$ w//返回X,Y 的平均值6 V6 S3 s' ~5 P8 ?1 d8 z$ s, N; J
int average(int x, int y)
7 u, Q7 y# Y0 z/ Z% X$ a6 i9 M7 }{   
" @/ }4 v/ z7 [: {0 L    return (x&y)+((x^y)>>1);* P0 i% g- Y6 g. M
}8 p) U8 j, C) a8 A& ?" N* F  V5 b
//判断a是否为2的幂次数
5 I& w6 D. g& w' k/ jbool power2(int x)6 ^( b' @! C3 G  ]1 D
{
9 m. t5 E9 V% a0 @    return ((x&(x-1))==0)&&(x!=0);. B5 A) v. M2 G5 c
}) D- K2 u5 Z2 o: @& c1 y( P" O) E1 E
//x与y互换) h6 w: \5 z, O* I# P3 z
void swap(int& x , int& y)
7 U3 \9 z( i4 k7 i: K2 u& @9 R3 H{& h" `% N/ Y: T7 W& J2 [
     x ^= y;0 n  s0 u8 ?: W- F$ n
     y ^= x;* M9 g& o* q6 I  M  s3 e: F
     x ^= y;
3 X$ m7 T( G  ?4 z& H0 ^}" ^- r% o% `) x& O
收藏 6 评论16 发布时间:2015-9-4 11:14

举报

16个回答
拉肚肚 回答时间:2015-9-4 11:36:10
creep 发表于 2015-9-4 11:25
+ {% K# p/ Y4 \- {" l' u9 u感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。
, L9 J4 \6 ~. C; t8 N
已经修改
拉肚肚 回答时间:2015-9-5 09:38:46
alvin_ 发表于 2015-9-5 09:35: `, l9 g4 r9 A0 a! A% ^8 @9 |
不错,以前确实没这么用过
) p3 a8 x% l& l7 ?- p
谢谢回贴,顺带我也刷下回复金币
拉肚肚 回答时间:2015-9-4 19:08:58
JackieLaura 发表于 2015-9-4 15:48
3 T7 d5 B! U6 Z" s7 O; j1 Y: r而且还是同一个帖子
( \$ f- e! u" \
哈哈 那么关注我
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
又看到你了
) u% P4 @% ~- l3 R( m
stmcu.org.png
JackieLaura 回答时间:2015-9-4 15:48:19
而且还是同一个帖子7 W+ ?: _8 b. c
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: h' z, ?( q/ ]; `
确实很实用啊
2 s. Q) [2 \) U2 f
嗯嗯
ROCK0525 回答时间:2015-9-5 09:52:31
谢谢楼主分享!
12下一页

所属标签

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