前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言位运算的妙用你知道多少?

C语言位运算的妙用你知道多少?

作者头像
诸葛青云
修改2018-08-29 13:23:05
1.3K0
修改2018-08-29 13:23:05
举报
文章被收录于专栏:诸葛青云的专栏

位运算在驱动开发中是经常遇到的,尤其是置0和置1。既要指定的位数发生变化,又不能改变其它位的值,还要高效率的编写代码,这时候技巧就很重要了。在位运算中有几个符号: |  按位或 、& 按位与 、 ^ 异或 、~按位非。

应用技巧

1

判断int型变量a是奇数还是偶数 

a&1   = 0 偶数

a&1   = 1 奇数

2

取int型变量a的第k位 (k=0,1,2……sizeof(int))

a>>k&1

3

将int型变量a的第k位清0

a=a&~(1<

4

将int型变量a的第k位置1

a=a|(1<

5

int型变量循环左移k次

(设sizeof(int)=16)

a=a<>16-k   

6

int型变量a循环右移k次

(设sizeof(int)=16)

a=a>>k|a<<16-k

小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:341636727!适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程

7

整数的平均值

 对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:

int average(int x, int y)   //返回X,Y 的平均值

{   

     return (x&y)+((x^y)>>1);

}

8

判断一个整数是不是2的幂,对于一个数 x >= 0

boolean power2(int x)

{

    return ((x&(x-1))==0)&&(x!=0);

}

9

用位运算符交换两个整数

void swap(int x , int y)

{

    x ^= y;

    y ^= x;

    x ^= y;

}

10

计算绝对值

int abs( int x )

{

  int y ;

  y = x >> 31 ;

  return (x^y)-y ;        //or: (x+y)^y

}

11

取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n - 1)

12

乘法运算转化成位运算 (在不产生溢出的情况下)

a * (2^n) 等价于 a<< n

13

除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n

      例: 12/8 == 12>>3

14

判断赋值

if (x == a) x= b;

   else x= a; 等价于 x= a ^ b ^ x;

15

x 的 相反数

 (~x+1)

技巧虽好,但是大家还是最好自己啃一啃才能知道味道呀,闲暇时,不防拿出来品一品,悟一悟其中的原理所在。

练一练

#include

int main()

{

     unsigned int i = 0x9f43bda5;

    unsigned int ret = 0;

     printf("i %x\n",i);

    //将 i 第3位置1    

     ret = i | ( 1 << 3 );

     printf("ret %x\n",ret);

     //将 i 第2位置0    

     ret = i  & ~( 1 << 2 );

     printf("ret %x\n",ret);

     //将 i 第4~9位置1    

     ret = i | ( 0x3f << 4 );

     printf("ret %x\n",ret);    

     //将 i 第3~7位置0    

     ret = i & ~(0x1f << 3 );

     printf("ret %x\n",ret);

     //将 i 第1~7和9~11位置1    

     ret = i | ( 0x3f << 1 | 7 << 9);

     printf("ret %x\n",ret);

     //将 i 第2~8位置13~20位置0

     ret = i & ~( 0x7f << 2 | 0xff << 13 );

     printf("ret %x\n",ret);

}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档