一、概念辨析:区分C语言中的逻辑运算和位运算
1、逻辑运算:
C语言中提供了三种逻辑运算符:
- && 与运算 双目运算符 左结合性
- || 或运算 双目运算符 左结合性
- ! 非运算 单目运算符 右结合性
应用场合:用于条件语句
2、位运算:
C语言提供了六种位运算符:
- (1) & 按位与
- (2) | 按位或
- (3) ^ 按位异或
- (4) ~ 取反
- (5) << 左移
运算法则:x << y——将x左移y位,将x最左边的y位丢弃,在右边补y个0。对于signed和unsigned是相同的
- (6) >> 右移
运算法则:x >> y——将x右移y位,这需要区分x是有符号数还是无符号数,具体情况如下:
- a、在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0;
- b、在x是有符号正数时,同无符号数的处理相同;
- c、在x是有符号负数时,将将x的最右边的y位丢弃,在左边补上y个1。
应用场合:用于二进制运算
3、逻辑运算和位运算的区别(以逻辑与和按位与为例)
对于两个逻辑量,都是一样的;
对于两个整型量,就不一样了,例如,对2和1进行逻辑与和按位与运算:
- 2&&1=1
- 2&1=0
二、位运算的使用
1、优秀程序员不得不知的20个位运算技巧
在本篇博客所举得例子中,完成相应功能的C语言代码都仅仅是一行位运算搞定。此处仅列出标题,以对该片博文的作者致敬。
- (1)获得int型最大值
- (2)获得int型最小值
- (3)获得long型最大值
- (4)乘以2运算
- (5)除以2运算
- (6)乘以2的m次方
- (7)除以2的m次方
- (8)判断一个数的奇偶性
- (9)不用临时变量交换两个数
- (10)取绝对值
- (11)取两个数的最大值
- (12)取两个数的最小值
- (13)判断符号是否相同
- (14)计算n的二次方
- (15)判断一个数是不是2的幂
- (16)对2的n次方取余
- (17)求两个整数的平均值
- (18)从低位到高位,取n的m位
- (19)从低位到高位,将n的第m位置1
- (20)从低位到高位,将n的第m位置0
- (21)另:计算n+1,计算n-1,取相反数,
- (22)sign函数,参数为n,当n>0时候返回1,n<0时返回-1,n=0时返回0。
另一篇参考博文:C/C++位运算技巧
2、位运算实现加法