专栏首页诸葛青云的专栏C语言位运算的妙用你知道多少?

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

位运算在驱动开发中是经常遇到的,尤其是置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);

}

原文链接:https://www.jianshu.com/writer#/notebooks/28627489/notes/32998967

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试中经常遇到10大C语言基础算法,最后一个是精髓

    算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手。本文是近百个C语言算法系列的...

    诸葛青云
  • C语言:画一个爱心 送女票

    其实学编程关键是学习其思想,如果你精通了一门,再去学其他的时候也很容易上手。C不会过时的,尤其是在unix、linux操作平台上,学好C是必须的。

    诸葛青云
  • 一看就会的C语言笔记——指针函数、函数指针、回调函数

    //函数返回值必须用同类型的变量来接受,也就是说,指针函数的返回值必须赋值给同类型的指针变量。

    诸葛青云
  • 探寻西安弈聪软件成为大数据运营与数据分析行业黑马的创业史

    2017年工信部公布了《大数据产业发展规划(2016-2020年)》,提出了到2020年的发展目标:大数据相关产品和服务业务收入突破1万亿元,年均复合增长率保持...

    西安弈聪软件公司
  • 弈聪软件行业大数据技术服务开启传统软件企业商业智脑

    当前“互联网+”,大数据技术,人工智能等思维下大环境下,整合让众多软件企业的管理者焦躁不安,迷惘不知所措。面对机遇和挑战,软件企业要转变思维、主动变革、逆流而上...

    西安弈聪软件公司
  • linux网络编程之socket(六):利用recv和readn函数实现readline函数

    在前面的文章中,我们为了避免粘包问题,实现了一个readn函数读取固定字节的数据。如果应用层协议的各字段长度固定,用readn来读是非常方便的。例如设计一种客户...

    s1mba
  • 优秀代码摘录片段一:LinkedList中定位index时使用折半思想

    在LinkedList有一段小代码,实现的功能是,在链表中间进行插如,所以在插如的过程中会需要找到对应的index位置的node元素;

    小勇DW3
  • 【前端攻略--HTML/CSS】这是你需要的transform学习教程

    transition语法格式:transition: property duration timing-function delay;

    小Gy
  • CSS3圆角边框和盒子阴影

    效果图矩形的圆角(即第二个图), 就不要用百分比,因为百分比会是表示高度和宽度的一半。 而我们这里矩形就只用高度的一半就好了。精确单位。

    乐心湖
  • 微信小程序之富文本编辑组件editor结合RichText进行显示

    专注APP开发

扫码关注云+社区

领取腾讯云代金券