操作符和表达式——位运算符分析

C语言中的位运算符
位运算符直接对bit位进行操作,其效率最高

位与&

注意:位与符号是一个&,两个&&是逻辑与。
1.位与操作的特点,只有1和1位与结果为1,其余全是0。
2.位与和逻辑与的区别:位与两个操作数按照二进制位批次对应位相与的,逻辑与两个

操纵数作为整体来相与的。
例1:0b1010 1010 & 0b1111 0000 = 0b1010 0000;
例2:0b1010 1010 && 0b1111 0000 = 1(只要不全为0,都为真)

位或|

注意:位或符号是一个|,两个||是逻辑或
1. 位或操作的特点是:只有两个0相位或才能得到0,只要有一个1个1结果就一定是1
2. 位或和逻辑或的区别:位或两个操作数按照二进制位批次对应位相或的,逻辑或两个操纵数作为整体来相或的。

例1:0b1010 1010 | 0b1111 0000 = 0b1111 1010;
例2:0b1010 1010 || 0b1111 0000 = 1(只要不全为0,都为真)

位取反~

注意:C语言中位取反是~,逻辑取反是!
1.按位取反是将操作数的二进制位逐个按位取反(1变成0,0变成1);而逻辑取反是真(在C语言中只要不是0的任何数都是真)变成假(在C语言中只有0是为假,负数也为真)

#include<stdio>

int main(void)
{
  int a = 45;
  int b,c;
  b = ~a;
  b= !a;
  printf("b = %d\n",b);
  printf("c = %d\n",a);
  return 0;
}

输出结果
b = -46
c = 0

位异或^

  1. 位异或真值表:1^1 = 0, 0^0 = 0, 1^0 = 1, 0^1 = 1
  2. 位异或特点:两个数如果相等结果为0,不相等结果为1。
#include<stdio>

int main(void)
{
  unsigned int a = 45,b = 23;     //45 :10 1101, 23: 01 0111
  unsigned int c;
  c = a ^ b;            //111010
  printf("c = %d\n",c);
  return 0;
}

输出结果
c = 58

左移<< 和 右移>>

  1. 左操作数必须为整数类型
  2. char和short被隐式转换为int后进行移位操作
  3. 右操作数的范围必须为:[0, 31]
  4. 左移运算符 << 将运算数的二进制位左移
    • 规则:高位丢弃,低位补0
  5. 右移运算符 >> 把运算数的二进制位右移
    • 规则:高位补符号位,低位丢弃。

移位运算符的问题

0x1 << 2+3的值会是什么?原作者的本意究竟想表达什么?

防错准则
1. 避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中
2. 当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量用括号()来表达计算次序

strong text小技巧
1. 左移n位相当于乘以2的n次方,但效率比数学运算符高
2. 右移n位相当于除以2的n次方,但效率比数学运算符高

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值