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 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

【转】Java知识点集锦(1~40)

答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primi...

11220
来自专栏阮一峰的网络日志

Base64笔记

昨天的《MIME笔记》中提到,MIME主要使用两种编码转换方式----Quoted-printable和Base64----将8位的非英语字符转化为7位的ASC...

19040
来自专栏猿人谷

size_type、size_t、differentce_type以及ptrdiff_t

目录(?)[-] size_type size_t different_type ptrdiff_t size_t是unsigned类型,用于指明数...

22770
来自专栏书山有路勤为径

栈与队列基础知识

栈,是先进后出的线性表,标准STL的栈包括如下5种操作,设栈S: 1.取出栈顶元素:S.top(); 2.判断栈是否为空:S.empty(); 3.将元素...

9020
来自专栏赵俊的Java专栏

两数之和

22230
来自专栏iOS技术杂谈

iOS @property探究(一): 基础详解你要知道的@property都在这里

你要知道的@property都在这里 本文大纲 Apple Adopting Modern Objective-C翻译 @property基本用法 @prope...

43990
来自专栏Felix的技术分享

霍夫曼压缩算法

36880
来自专栏玄魂工作室

如何学python 第八课 流程控制-For,While,循环语句,函数

循环语句 也许你会问,什么是‘循环’?在脚本程序里,循环就是‘在一定情况下一次又一次的执行某些代码’。举个例子来说,假设你很饿,桌上有好多好多个馒头,当你依旧饿...

35290
来自专栏cs

c++那些事儿12.0 STL--Map

知识点综述: ---- map:关联容器。 1.0 由key--value组成,通过key,查找value,关键字key唯一。 2....

34650
来自专栏机器之心

资源 | 忘了Python关键语句?这份备忘录拯救你的记忆

Python 3 Cheat Sheet 一共包含两页,分成了多个框图,涉及基本的 Python 数据结构、数学运算、条件和循环语句、文件读写,以及异常值处理等...

12930

扫码关注云+社区

领取腾讯云代金券