【C语言】移位和位操作符

举报
謓泽 发表于 2023/09/16 14:51:57 2023/09/16
【摘要】 移位和位操作符

🎓移位操作符 

  • 二进制左移运算符("<<"),将一个运算对象的各二进制位全部左移若干位 (左边的二进制位丢弃,右边补0)
  • 注:高位丢弃,低位补0。
  • 二进制右移运算符(">>"),将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。算数右移补的是最高位的数字,逻辑右移补的都是0。注意:我们通常都是采用的是算数右移的方式!
  • 注:低位丢弃,高位补0『正数补0、负数补1』
<<(左移):最高位丢弃,最低位补0 
>>(右移)如下↓
1.无符号数(unsigned):最低位丢弃,最高位补0
2.有符号数(signed):最低位丢弃,最高位补符号位.(★)
注:取决于数据类型

例如 A = 2,A<<1,得到的数字是:4

  • 00000000000000000000000000000010
  • 00000000000000000000000000000100

例如 A = 2,A>>1,得到的数字是:1

  • 00000000000000000000000000000010
  • 00000000000000000000000000000001

注意:在按位移动的时候,我们要移动正常的位数,你可不能移动100位那就出大问题

 ⚠:对于移位运算符,不要移动负数位,这个是标准当中未定义的。 

  •  例如:
int num = 2;
num << -5; //错误

🎓位操作符 

🖊 按位与运算符("&")

  • 双目运算符。其功能是参与运算的两数各对应的二进位相与,只有对应的两个二进位均为 1 时,结果位才为 1,否则为 0。参与运算的数以补码方式出现。

运算规则

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;

例如:9 & 5,代码如下所示:

#include <stdio.h>
int main(void)
{
	int a = 9;                //00001001 - 9
	int b = 5;                //00000101 - 5
	int c = a & b;            //00000001 - 1
	printf("number = %d\n", c);
    return 0;
}
  •  运行结果:number = 1

🖊 按位或运算符("|")

  • 双目运算符。其功能是参与运算的两数各对应的二进位相或。只要 对应的二个二进位有一个为 1 时,结果位就为 1。参与运算的两个数均以补码出现。  

运算规则

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;

例如:9 & 5,代码如下所示:

#include <stdio.h>
int main(void)
{
	int a = 9;                //00001001 - 9
	int b = 5;                //00000101 - 5
	int c = a | b;            //00001101 - 13
	printf("number = %d\n", c);
    return 0;
}
  • 运行结果: number = 13

🖊 按位异或运算符("^") 

  • 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。

  • 相同为0,一个数字异或上了0就相当于本身的那个数字。

运算规则

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;

例如:将 a = 9 和 b = 5 的值进行交换,不能创建变量进行交换!代码如下所示:

#include <stdio.h>
int main(void)
{
	int a = 9;
	int b = 5;
	printf("交换之前:a = %d  b = %d\n", a, b);
	a = a ^ b; // 1001 ^ 0101 = 1100 (12)
	b = a ^ b; // 1100 ^ 0101 = 1001 (9)
	a = a ^ b; // 1100 ^ 1001 = 0101 (5) 
	printf("交换之后:a = %d  b = %d\n", a, b);
    return 0;
}

从上面代码我们可以知道,按位异或(^),可以不用创建临时变量达到交换两个数字的值。 

  • 运行结果:交换之前:a = 9    b = 5     换行    a = 5    b = 9
  • 注:位操作符都必须是整数! 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。