计算机中的位运算总结

程序中的所有数在计算机内存中都是以二进制的形式 储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行 操作
在C语言中,提供了相应的进行位运算的操作符,它们的作用如下:
1、&:位逻辑与
2、 |:位逻辑或
3、^:位逻辑异或
4、~:位逻辑反
5、>>:右移
6、<<:左移
位运算是对字节或字中的实际位进行检测、设置或者移位,它只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用。
(1)逻辑与的运算规则:当进行两个数的逻辑与运算时,先将该两个数化为二进制,然后进行逻辑与运算,当相同位的数只有当双方都为1时,结果才为1,否则为0。

测试代码如下:

#include <stdio.h>

int main()
{
	int a,b,c;
	a=5;
	b=4;
	c=a&b;
	printf("%d",c);
	
	return 0;
 } 
结果如下:

分析:
因为a=5,化为二进制为:0101,b=4,化为二进制为:0100.
对这两个二进制数进行与运算,则为0100,化为十进制数则为4,所以c=4。
(2)逻辑或的运算规则:当进行两个数的逻辑或运算时,先将该两个数化为二进制,然后进行逻辑或运算,当相同位的数只要有一方为1,结果就为1,否则为0。
测试代码如下:
#include <stdio.h>
int main()
{
	int a,b,c;
	a=2;
	b=9;
	c=a|b;
	printf("%d",c);
	return 0;
 } 
结果如下:
分析:
a=2,化为二进制数为:0010,b=9,化为二进制数为:1001。将这两个二进制数进行逻辑或运算,则为:1011,化为十进制数为11。所以c=11。
(3)逻辑异或的运算规则:当进行两个数的逻辑异或运算时,先将该两个数化为二进制,然后进行逻辑异或运算,当相同位的数只有当双方都为不同数字时,结果才为1,否则为0。
测试代码如下:
#include <stdio.h>
int main()
{
	int a,b,c;
	a=6;
	b=8;
	c=a^b;
	printf("%d",c);
	return 0;
 } 

结果如下:
分析:
a=6,化为二进制数则为0110,b=8,化为二进制数为1000,这两个二进制数进行异或运算则为1110,化为十进制数为14,所以c=14、
(4)逻辑反的运算规则:当进行一个数的逻辑反运算时,先将这个数化为二进制,然后进行逻辑反运算,当数为1时,结果为0,当数为0时结果为1。
测试代码如下:
#include <stdio.h>

int main()
{
	int a,b;
	a=12;
	b=~a;
	printf("%d",b);
	return 0;
 } 

结果如下:
分析:
按照上面的运算规则,我们先将12转换为二进制,为1100,进行位逻辑反运算,则为0011,化为十进制数结果应为3才对啊,那为什么测试的结果是-13呢?
原来啊,在计算机中,二进制的存储方式是以补码的形式存储的。
所以,12在计算机内存储的是01100(第一个0位符号位,代表这个数是正数),对其进行逻辑反运算则为10011,但这个二进制只是b这个变量在计算机内的存储形式(即b的补码形式),所以我们需要将其转换为原码形式,由于符号位为1,为负数,所以我们先对10011转换为反码,即11100,再对其进行+1,所以结果为11101,转换为十进制数则为-13。所以b=-13。
(5)右移操作运算规则:左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;低位右移溢出则舍弃该位。
测试代码如下:
#include <stdio.h>

int main()
{
	int a,b;
	a=127;
	b=a>>2;
	printf("%d",b);
	return 0;
 } 

结果如下:
分析如下:
a=127,转换为二进制为01111111,由于二进制在计算机内部是以补码的形式进行存储,但由于127是正数,所以其补码为01111111,对该补码进行右移操作运算,按照运算规则,得到00011111,转换为原码,依旧为00011111,转换为十进制数为31,所以,b=31。
对多组数据进行测试,我们可以得到这样一个规律:
当一个数进行n位的右移操作后,所得到的新的数=被操作数/2^n.
(6)左移运算操作规则: 右边空出的位用0填补,高位左移溢出则舍弃该高位。
测试代码如下:
#include <stdio.h>

int main()
{
	int a,b;
	a=-127;
	b=a<<3;
	printf("%d",b); 
	return 0;
}

结果如下:
分析如下:
a=-127,转换为二进制为1000 0111 1111,转换为反码为1111 1000 0000,转换为补码是1111 1000 0001,对其进行左移三位的操作,得到:1100 0000 1000,将其转换为反码:1100 0000 0111,再将其转换为原码:1011 1111 1000,转换为十进制数,为-1016,所以b=-1016。
对多组数据进行测试,我们可以得到这样一个规律:
当一个数进行n位的左移操作后,所得到的新的数=被操作数*2^n.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值