4月从零学习C语言(第27天)——位运算

4月从零学习C语言(第27天)——位运算符

位运算

我们知道计算机程序中的所有数在计算机内存中都是以二进制的形式来储存的。而直接对整数在内存中的二进制位进行操作的运算就是位运算。在C语言中也给我们提供了位运算。

位运算符

C语言为我们提供了6中位运算符:

运算符名称描述
&按位与让参与运算的两个数对应的二进制位分别相与
|按位或让参与运算的两个数对应的二进制位分别相或
^按位异或让参与运算的两个数对应的二进制位分别相异或
~按位反把运算对象的内容按位取反
<<左移<<左边的运算数的各位二进制位全部左移若干位
>>右移>>左边的运算数的各位二进制位全部右移若干位

在以上运算中除了~为单目运算外,其余均为双目运算符。另外运算对象只能是整型或者字符型数据,不能是实型数据。

拓展:&、 | 和 ^ 的真值表如下所示:

pqp & qp | qp ^ q
00000
01011
11110
10011

按位与

让参与运算的两个数对应的二进制位分别相与。只有对应的两个位均为1时,结果才为1,否则为0.即0&0=0,0&1=0,1&0=0,1&1=1。

例如9&5:

 00001001  //9的二进制原码
&00000101  //5的二进制原码
——————————
 00000001  //1的二进制原码

实例:

#include <stdio.h> 

int main() 
{ 
  int a=9,b=5,c;
  c=a&b;
  printf("%d&%d=%d \n",a,b,c);
  return 0; 
}

运行结果:
在这里插入图片描述

按位或

让参与运算的两个数对应的二进制位分别相与。只有对应的两个二进制位均有一个1时,结果就为1,否则为0.即0|0=0,0|1=1,1|0=1,1|1=1。

例如6|2:

 00000110  //6的二进制原码
|00000010  //2的二进制原码
——————————
 00000110  //2的二进制原码

实例:

#include <stdio.h> 

int main() 
{ 
  int a=6,b=2,c;
  c=a|b;
  printf("%d|%d=%d \n",a,b,c);
  return 0; 
}

运行结果:
在这里插入图片描述

按位异或

让参与运算的两个数对应的二进制位分别相异或。只有对应的两个二进制位不同时,结果就为1,否则为0.即00=0,01=1,10=1,11=0。

例如6^2:

 00000110  //6的二进制原码
^00000010  //2的二进制原码
——————————
 00000100  //4的二进制原码

按位异或的几个常见用途:

(1) 使某些特定的位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
      10100001^00000110 = 10100111

(2) 实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
    a = a^b;   //a=10100111
    b = b^a;   //b=10100001
    a = a^b;   //a=00000110

(3) 与0按位异或,保留原值。

按位取反

按位取反运算符为单目运算符,运算对象就至于运算符的右边,具有右结核性。功能就是把运算符的内容取反,即0变成1,1变成0.

例如~9:

~(00001001)
结果为:11110110

左移

二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

例如:

int a=8,b;
b=a<<3;

在二进制表示运算过程如下:

a:     00001000(a=8)
b=<<3: 01000000(b=64)

右移

二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

例如:

int a=15,b;
b=a>>2;

在二进制表示运算过程如下:

a:     00001111(a=8)
b=>>2: 00000011(b=64)
  • 125
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 41
    评论
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值