!与~有什么区别

简介: !与~有什么区别

我们都知道!与~都是用于取反的。那么这两个有什么区别呢?

我们百度结果如下,很明显,八股文。我接下来将会用实际例子解释。


将整型数据转换为二进制的函数

我们先看一个将数据转换为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。这个没有为什么,就是规定!


目录
相关文章
|
2月前
i++和++i的区别
i++和++i的区别
43 3
|
6月前
MTP3 和 MTP3B 的区别
【4月更文挑战第11天】
77 0
MTP3 和 MTP3B 的区别
|
6月前
|
存储 前端开发 JavaScript
for...in、for...of、for...Each的详细区别!
for...in、for...of、for...Each的详细区别!
|
6月前
a++与++a的区别
a++与++a的区别。
40 4
|
JavaScript 小程序
bindtap和catchtap的区别?
在微信小程序中,bindtap 和 catchtap 都是用于绑定点击事件的属性,但它们在事件冒泡和事件捕获方面有所不同。
|
JSON 数据格式
中writeValue和writeValueAsString的区别
writeValueAsString(obj):将传入的对象序列化为json,返回给调用者
|
算法 编译器 Linux
C与C++的区别
C与C++的区别
123 0
<T>和<?>区别
简要讲述一下<T>和<?>区别,以及<T>的用法
<T>和<?>区别
rsaCheckV2 和rsaCheckV1的区别分享
说明: 目前支付宝的SDK验签方法主要有两种一种是rsaCheckV1一种是rsaCheckV2 两种验签方法用于不同的接口的返回参数验签 1.rsaCheckV1验签方法   rsaCheckV1验签方法主要用于支付接口的返回参数的验签比如:当面付,APP支付,手机网站支付,电脑网站支付 这些接口都是使用rsaCheckV1方法验签的 2.
3612 11
@EnableEurekaClient上有@EnableDiscoveryClient区别
@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
936 0