【C语言】移位操作符和位操作符-创新互联

移位操作符和位操作符
    • 前言
    • 整数在内存中的存储
    • 原码·反码·补码
    • 移位操作符
      • 左移操作符
      • 右移操作符
    • 位操作符
      • 按位与(&)
      • 按位或( | )
      • 按位异或( ^ )

创新互联是一家集网站建设,瓮安企业网站建设,瓮安品牌网站建设,网站定制,瓮安网站建设报价,网络营销,网络优化,瓮安网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。前言

位操作符和移位操作符都是针对于二进制进行操作的

整数在内存中的存储

整数在内存中储存的是他的二进制补码

整数(int)在内存空间中占四个字节
在这里插入图片描述

原码·反码·补码

正数原码反码补码相同
负数反码等于源码处符号位其余为取反
补码等于补码+1

例如10的二进制序列为1010
补码和原码相同 即
00000000 00000000 00000000 00001010
例如-10的二进制序列为
10000000 00000000 00000000 00001010
反码为
11111111 11111111 11111111 11110101
补码为
11111111 11111111 11111111 11110110

移位操作符

移位操作符包括
左移操作符:<<
右移操作符:>>
注意移位操作符的对象必须是整数

左移操作符

左移操作符的规则是左边丢弃,右边补0

例如10左移两位
先写出10的二进制序列
00000000 00000000 00000000 00001010
补码是
00000000 00000000 00000000 00001010
左移两位右边补0后
00000000 00000000 00000000 00101000
用十进制表示就是40

#includeint main()
{int b = 10<< 2;
	printf("%d",b);
	return 0;
}

在这里插入图片描述

右移操作符

右移操作符分为两种,算术右移和逻辑右移
算术右移是右边丢弃,左边补原来的符号位
逻辑右移是右边丢弃,左边补零

位操作符

C语言中位操作符有按位与 按位或 按位异或
他们的操作数是整数 ,对象是整数的二进制序列

按位与(&)

运算编码:补码
将整数从十进制转化为二进制数,上下比较,有零则零 ,两个都是 1 才是 1。

例如10&15
10的二进制序列为00000000 00000000 00000000 00001010
15的二进制序列为00000000 00000000 00000000 00001111
他们都是正数,原码反码补码都相同,所以直接上下比较
得到 00000000 00000000 00000000 00001010 十进制为10

#includeint main()
{int a = 10, b = 15;
	printf("%d", (a & b));

	return 0;
}

在这里插入图片描述

例如-10和-15
-10原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
补码11111111 11111111 11111111 11110110
-15原码10000000 00000000 00000000 00001111
反码 11111111 11111111 11111111 11110000
补码 11111111 11111111 11111111 11110001
上下比较得到 11111111 11111111 11111111 11110000
转化为原码是 10000000 00000000 00000000 00010000
转化为十进制数是-16

#includeint main()
{int a = -10, b = -15;
	printf("%d", (a & b));

	return 0;
}

在这里插入图片描述

按位或( | )

运算编码:补码
将整数从十进制转化为二进制数,上下比较,有1则1 ,两个都是 0 才是 0。

例如10 | 15
10的二进制序列为00000000 00000000 00000000 00001010
15的二进制序列为00000000 00000000 00000000 00001111
他们都是正数,原码反码补码都相同,所以直接上下比较
得到 00000000 00000000 00000000 00001111
十进制为15

#includeint main()
{int a = 10, b = 15;
	printf("%d", (a | b));

	return 0;
}

在这里插入图片描述

例如-10和-15
-10原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
补码11111111 11111111 11111111 11110110
-15原码10000000 00000000 00000000 00001111
反码 11111111 11111111 11111111 11110000
补码 11111111 11111111 11111111 11110001
上下比较得到 11111111 11111111 11111111 11110111
转化为原码是 10000000 00000000 00000000 00001001
转化为十进制数是-9

#includeint main()
{int a = -10, b = -15;
	printf("%d", (a | b));

	return 0;
}

在这里插入图片描述

按位异或( ^ )

运算编码:补码
将整数从十进制转化为二进制数,上下比较,上下比较,相同为 0 ,相异为 1

例如0 ^ 15
10的二进制序列为00000000 00000000 00000000 00001010
15的二进制序列为00000000 00000000 00000000 00001111
他们都是正数,原码反码补码都相同,所以直接上下比较
得到 00000000 00000000 00000000 00000101
十进制为5

#includeint main()
{int a = 10, b = 15;
	printf("%d", (a ^ b));

	return 0;
}

在这里插入图片描述

例如-10和-15
-10原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
补码11111111 11111111 11111111 11110110
-15原码10000000 00000000 00000000 00001111
反码 11111111 11111111 11111111 11110000
补码 11111111 11111111 11111111 11110001
上下比较得到 00000000 00000000 00000000 00000111
转化为原码是 00000000 00000000 00000000 00000111
转化为十进制数是7

#includeint main()
{int a = -10, b = -15;
	printf("%d", (a ^ b));

	return 0;
}

在这里插入图片描述

希望我的博客对你的学习有帮助
IDE VS2022

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:【C语言】移位操作符和位操作符-创新互联
文章链接:http://myzitong.com/article/dcggdp.html