【c语言第八剑】(&)按位与(|)按位或以及(^)按位异或

按位与(&)

一、按位与(&)的介绍

参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0;
看到这段话是不是很晦涩难懂,没关系,我们用画图的方法来了解它,学习编程语言最好的方法永远是画图

假设我们存储的数字是11,且存在32位的机器上,那他的存储表现即为:

在这里插入图片描述
此为11存储在32位电脑下的二进制位

在这里插入图片描述
此为1存储在32位电脑下的二进制位

当我们用数字&11时,会发生什么现象呢

在这里插入图片描述
结果就是当1&11时,新产生的数字变成了1;
由此,我们要引出一个概念
当一个整型数字按位与另一个整形数字时;两个数的每一个位互相比较,如果这两个数字的的同一个位是1,则为1,当不同或者同时是0时 ,为0;
0001
=0001
1011

此为简易表达式

## 二、按位或(|)的介绍

按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。例如
0101 (十进制 5) OR 0011 (十进制 3) = 0111 (十进制 7)
在C类程序设计语言中,按位或操作符是"|"。这一操作符需要与逻辑按位或运算符(||)区别开来。
我们依然用画图的方式来表达他
在这里插入图片描述
此为整形1
在这里插入图片描述 此为整形11
在这里插入图片描述
此为1按位或(|)的结果,他的结果是11
我们发现,按位或(|)与按位与(&)的结果完全相反
当一个整型数字按位与另一个整形数字时;两个数的每一个位互相比较,如果这两个数字的的同一个位是0,则为1,当不同或者同时是1时 ,为0;
0001
=1011
1011

此为简易表达式

三、按位异或(^)的介绍

按位异或完全不用画图解释,只有一句话
相同为零,相异为1;
0001
=1011
1011

这个表达式可能不够清楚,我们在举一个例子
1111
=0011
1100
是不是非常简单,当我们了解了他们的定义后,我们就可以尝试写一道练习题,来加深对它们的理解

统计二进制中1的个数
当看到题目是,我们首先分析,想要访问二进制的位数,必然要使用按位操作符,即&,|,^
而按位与(&)的定义是同时唯一是为1,否则为零;
在这里插入图片描述
我们使用按位与(&)完全可以在不影响整型数的本身的同时,计算他的1的个数
那么他的逻辑该是什么呢
n&(1<<i)
我们想一想,当1移动一位和n作比较时,同时为一时1,不是为零,而一个整型在32位的存储下有32位,我们只需要循环32次,在用一个变量计数他,就可以得出1的个数

void Binary(int n)
{
    
    
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
    
    
		if (n & (1 << i))
		{
    
    
			count++;
		}
	}
	printf("%d", count);
}
int main()
{
    
    
	int n = 0;
	scanf("%d", &n);
	Binary(n);
	return 0;
} 

此为代码
学习了按位操作符后,不禁感慨,曾经创造出计算机的科学家的头脑究竟是怎样的,才能想到这些神奇的符号,神奇的计算。我们总说科学家就是通往未来的钥匙,却没有一个具体的概念。可是当我们真正了解了他们的过往,他们总结出的神奇的逻辑,才发现,他们是如此聪慧,甚至可以说是神秘。如果说科学的尽头是神学,那么想说,科学家就是新世界的神明。

猜你喜欢

转载自blog.csdn.net/nanmiao666/article/details/130615963