liuchuanwu的个人博客分享 http://blog.sciencenet.cn/u/liuchuanwu

博文

C语言的位运算

已有 6683 次阅读 2013-9-23 19:44 |个人分类:C语言|系统分类:科研笔记| C语言, 位运算

位运算即按二进制位(包括符号位)进行运算,是C语言的重要特色。只有字符型和整型数据可以进行位运算,浮点型不能进行位运算。原则上所有运算皆可化成位运算。C语言的位运算快于普通运算,所以是一种运算优化方法。


一、按位与(&)

0&0=0&1=1&0= 0,1&1=1。如3&5=0000 0011&0000 0101=0000 0001。负数参与&运算,以补码表示。应用:

1,对一个数的特定位置0。次数与一个这些位上为0的数进行&运算。

2,取一个数的某些位。此数与一个这些位上为1的数进行&运算。如取a的后四位:a&0000 1111。特别的,通过取最后一位可以判断此数的奇偶行,即a&1。


二、按位或(|)

0|0=0,0|1=1|0=1|1=1。如48|15=0011 0000|0000 1111=0011 1111。应用:

1,对一个数的特定位置1。此数与一个这些位上为1的数进行|运算。


三、异或(^)

0^0=1^1=0,0^1=1^0=1。如0011 1001^0010 1010=0001 0011。应用:

1,使一个数的特定位翻转。此数与一个特定位上为1的数进行^运算。

2,与0相^,保持原值。

3,交换两值,不用临时变量。a=a^b;b=b^a;a=a^b(或a^=b^=a^=b;)。


四,取反(~)

单目运算,0变1,1变0。如~0001 0101=1110 1010。~运算优先级高于其他位运算符。应用:

1,在不知数据长度的情况下,得到某些位为0的数。如~1=... 1111 1110。

2,得到unsign [long] int型的长度。...1111 1111=~0(即-1补码)。


五、左移(<<)

将一个二进制数左移若干位,右端补0,左端溢出舍弃。应用:

1,通过1<<n来计算2的n次方。

2,左端不溢出的情况下,一个数左移n位等于乘以2的n次方。


六、右移(>>)

将一个二进制数左移若干位,右端移出舍弃。对无符号数和正的有符号数的左端补0;对负的有符号数,有的补0(逻辑右移或简单右移),有的补1(算数右移),取决于编译器(gcc为算数右移)。用途:

1,一个正数右移n位或一个负数算数右移n位等于或约等于除以2的n次方,当无1移出的情况下取等号。


通过位运算可以把多个较小的数存在一个数据的不同位段上。需要注意的是位运算虽然可以提高运算速度,但好的算法永远是代码优化的根本。


2013年9月23日



https://wap.sciencenet.cn/blog-1005104-727277.html

上一篇:C语言程序代码优化
下一篇:刘丁宁的北大情结
收藏 IP: 128.250.55.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-18 21:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部