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

95 阅读7分钟

移位操作符和位操作符

前言

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

整数在内存中的存储

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

整数(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

#include<stdio.h>
int 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

#include<stdio.h>
int 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

#include<stdio.h>
int 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

#include<stdio.h>
int 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

#include<stdio.h>
int 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

#include<stdio.h>
int 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

#include<stdio.h>
int main()
{
	int a = -10, b = -15;
	printf("%d", (a ^ b));

	return 0;
}

在这里插入图片描述

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