我们都知道!与~都是用于取反的。那么这两个有什么区别呢?
我们百度结果如下,很明显,八股文。我接下来将会用实际例子解释。
将整型数据转换为二进制的函数
我们先看一个将数据转换为2进制的函数。具体是怎么实现的不要纠结,如果有基础的可以自己研究一下。我们只要知道,仅需要更改两个define部分即可。
注意:因为&左右都必须是整型,所以这个函数不能将浮点数据转换为2进制。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define Type int //设置需要转换进制的变量类型 #define ChangeNum 32 //设置需要转换进制的变量具体数值 //conversion of number systems 进制转换函数 void CONS(Type x) { char i; unsigned short Num = sizeof(Type)* 8; Type b = 0, flag; for (i = 1; i <= Num; i++) { flag = 1 << (Num - i); b = (flag & x) ? 1 : 0; //因为&左右都必须是整型,所以这个函数不能将浮点数据转换为2进制 printf("%d", b); if (i % 4 == 0)printf(" "); } printf("\n"); } int main() { Type a = ChangeNum; CONS(a); return 0; }
利用函数查看!与~之后的数据有何不同
以一个非0数据作为例子
(1)我们发现,原来a是第6个bit为1。
(2)经过~之后,除了第6个bit,其他bit全部为1。因为int型数据有4个字节,也就是32个bit,所以这里会先是32个bit数据。~的作用就是,把这个数据的每一bit都取反,将每一个bit0变成1,1变成0。
(3)经过'!'之后,我们发现全部变成0了。那么'!'作用是什么呢?'!'这个是逻辑运算,在逻辑运算中,只存在0和非0两种情况,现在十进制32不等于0,那么我们就可以称之为非0。所以现在会将其变为0。
以0作为例子
现在我们将ChangeNum改为0,看看结果如何。
(1)经过~之后,我们发现所有数据都变为1了。这也印证了把这个数据的每一bit都取反。
(2)经过'!'之后,我们发现只有第一个bit变成了1,其他的都是0。这又是为什么呢?因为,在逻辑运算中,只存在0和非0两种状态,当非0逻辑取反(也就是!之后),结果为0。但是如果0进行逻辑取反,却是1。这个没有为什么,就是规定!