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

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

[复制链接]
拉肚肚 发布时间:2015-9-4 11:14
本帖最后由 拉肚肚 于 2015-9-4 11:35 编辑
3 u4 E0 i4 A/ y8 W
/ i7 @% b$ J7 @. [9 z  s8 b+ u我很少用到这些位运算,不过用位运算可以提高程序运行效率,写程序的时候稍微考虑下,代码立马高大上。6 d8 e5 t% Z, L2 ]6 e$ }
(1) 判断int型变量a是奇数还是偶数           
9 N6 o! P" _: d9 B5 Q6 }  a&1   = 0 偶数
3 C" z6 i1 ^5 u) q( _9 U  a&1   = 1 奇数
: D3 k. \0 F/ D8 q! z; v5 J$ c(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1, n% F7 y' x( x) @5 o. j/ ?( D
(3) 将int型变量a的第k位清0,即a=a&~(1<<k)3 {& J* O) T' {' T8 Y
(4) 将int型变量a的第k位置1, 即a=a|(1<<k)" f$ |1 p7 ]1 d* i6 H4 K
(5) int型变量循环左移k次,即a=a<<k|a>>16-k   (设sizeof(int)=16)0 s* x8 a6 O6 C% ]% C
(6) int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(int)=16)
1 ~; [7 y8 C1 K3 }2 |+ w' m+ N(7)整数的平均值
! C# D4 r+ S: F8 R    对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:, m, }& }. l3 b: E) [4 a0 z0 E
int average(int x, int y)   //返回X,Y 的平均值1 R+ f+ a/ C8 M7 \
{   
5 U9 D$ \4 k5 M     return (x&y)+((x^y)>>1);
; h1 V1 Z( @8 E3 w6 N}
) F3 a4 D! B( |9 @- y- A; X% X(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
2 |6 m  J( W: t+ R4 D9 _* Kboolean power2(int x)
% P/ \& H  v4 G+ [+ m- [+ R$ F{
" Y( v' o' |8 l1 ]9 a" x. N6 n    return ((x&(x-1))==0)&&(x!=0);
8 @7 z: b* r/ Z' L7 ^}
6 @. Q" U9 i; r2 S) K' y(9)不用temp交换两个整数
' X! e. u/ G8 @* X# \/ K! uvoid swap(int x , int y)  R6 q5 Y6 Y/ z4 a" K
{
' N# [+ j. U: |9 m- t    x ^= y;
" r8 Z7 U5 z+ Y' o0 u  t/ j, h    y ^= x;3 d; S% \$ R8 U
    x ^= y;& p- i/ j* I( `5 I
}- S7 F4 s8 w+ W' f" e' o" E  ?, \
(10)计算绝对值
7 K4 @: z* o  r: sint abs( int x )5 Y' T' X, K% R3 I* h" u+ {
{+ q( a: J- S' o3 b# Q# G
  int y ;
8 o4 K/ p: `+ x! Y" Q. v  y = x >> 31 ;
% k7 y) \  y/ q, E8 `: ~6 z# X, [$ Y  return (x^y)-y ;        //or: (x+y)^y7 b+ Q8 b% M! h
}
. G* L7 v0 C: V5 `(11)取模运算转化成位运算 (在不产生溢出的情况下)' M; Z( b- r4 G2 _& @' T, n
      a % (2^n) 等价于 a & (2^n - 1)
4 K0 ~8 l( A# A& S: k(12)乘法运算转化成位运算 (在不产生溢出的情况下)
  O1 t. I* r7 H$ M! m% X; [0 _      a * (2^n) 等价于 a<< n
1 z9 q) c$ _( b; {2 b0 J(13)除法运算转化成位运算 (在不产生溢出的情况下)
5 T) w4 V2 ]; _+ b( V      a / (2^n) 等价于 a>> n
9 B( u) Z: M& S- }- v      例: 12/8 == 12>>3
& Y% Y5 e9 f; o7 s(14) a % 2 等价于 a & 1       8 A) g/ l3 J5 y) z# d# X; @- T
(15) if (x == a) x= b;
  X6 o% B/ g! O6 t# n: b8 ^2 E   else x= a; 等价于 x= a ^ b ^ x;5 f! g3 V5 }- g; R6 f
(16) x 的 相反数 表示为 (~x+1)  {6 I0 S7 P! f& c' G

0 U: b& ?' m0 b& t, K7 {0 _

5 Y% t, M* I: i8 L- ?% o
( O! b2 K7 `( H3 Y
& O5 p: z2 c+ m% f* W7 \
//设置x的第y位为1
* w4 M3 u: V5 V( C' @, g/ n! I: {#define setbit(x,y) (x)|=(1<<(y-1))! m+ J4 T4 O8 Y9 p3 ]% e" e7 {/ w( j
//得到x的第y位的值% }! W3 p) z8 g6 ?+ R1 X  ?
#define BitGet(Number,pos) ((Number)>>(pos-1)&1)
; c7 F: N$ [1 W# K8 a//打印x的值
9 P3 j" A$ m1 I3 c$ f# l#define print(x) printf("%dn",x)
8 t6 w/ U" P" `4 t, V' N//将整数(4个字节)循环右移动k位
# ^8 M2 Y9 `" P/ ^' ]#define Rot(a,k) ((a)<<(k)|(a)>>(32-k))0 ?' F7 \+ Q9 A! o  C: Y% q
//判断a是否为2的幂次数0 c& e: A- o1 u9 `+ m, B% T6 [
#define POW2(a) ((((a)&(a-1))==0)&&(a!=0))) k: t# k  H1 |- |
#define OPPX(x) (~(x)+1)
. {8 l; o/ G5 \; c2 u//返回X,Y 的平均值
& f: v( ^; J5 W& B" Iint average(int x, int y)
1 i6 E/ c. g  Q{   
" [0 P0 K2 f3 W( i- r, Q    return (x&y)+((x^y)>>1);3 K" I! C; W, ~+ ^, @" \" j
}3 }, R- E. B/ Y+ w/ p/ ?/ ]6 m) I1 w5 W
//判断a是否为2的幂次数. S1 F3 l# R& ~1 S3 W, b
bool power2(int x)3 \* `  |0 W. s" X) L; ]4 o4 |$ R* J
{
* S1 i. g1 h! v* n    return ((x&(x-1))==0)&&(x!=0);
) ~' Q# p4 w2 S8 Z9 p6 o}/ }! ^0 k3 R- A' l! s) o# L4 R
//x与y互换
% {' P9 k. y! T) E  wvoid swap(int& x , int& y)
3 Q; |0 d  i/ _{) C& a2 W4 ]4 e1 m5 j
     x ^= y;
- o+ D6 f: z9 l% x' K     y ^= x;' i- z+ t# {$ }1 ~2 T
     x ^= y;' u; G4 c! J$ H8 b/ o! X, b, n
}% l  Q, Q! @/ o9 q
赞 收藏 6 评论16 发布时间:2015-9-4 11:14

举报

16个回答
拉肚肚 回答时间:2015-9-4 11:36:10
creep 发表于 2015-9-4 11:25
( x6 z$ q: s( p; s感谢分享,为何不把文字背景去掉呢,这样看起来不是很舒服。

5 \5 S! }0 N( o( x已经修改
拉肚肚 回答时间:2015-9-5 09:38:46
alvin_ 发表于 2015-9-5 09:35: j+ y! ]; V5 Z" J0 ^
不错,以前确实没这么用过

- X; f1 E* ]: O: Y谢谢回贴,顺带我也刷下回复金币
拉肚肚 回答时间:2015-9-4 19:08:58
JackieLaura 发表于 2015-9-4 15:48
* _0 Z; Y' n2 ~而且还是同一个帖子

; v* B( }# y8 T! O# l. j( i* v哈哈 那么关注我
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
又看到你了
% S, Z% o4 i5 D* O. f
stmcu.org.png
JackieLaura 回答时间:2015-9-4 15:48:19
而且还是同一个帖子- `) ^& W. p/ y' S
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
# ]/ [4 @# [5 x5 o0 H- }5 H确实很实用啊

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