当前位置:首页 » 《资源分享》 » 正文

~操作符含义及用处举例(详细易懂)_m0_53558236的博客

23 人参与  2021年10月18日 09:23  分类 : 《资源分享》  评论

点击全文阅读


~操作符含义及用处举例

文章目录

  • "~"的含义
  • "~"的作用举例

"~"的含义

~:对一个数的二进制按位取反

对整个数,包括符号位都可以按位取反。

一起来看下面这段代码:

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

输出的b是什么呢?一起来看一下

a:00000000000000000000000000000000

b = ~a全部按位取反,即

b:11111111111111111111111111111111 //b的补码

这行代码:printf("%d\n", b);

💡注意:%d去打印的时候,认为内存中存放的是有符号数的补码

现在我们要来计算b的原码

先算出b的反码:(补码减1)

11111111111111111111111111111110 //b的反码

原码即为:(反码的符号位不变,其他位按位取反)

10000000000000000000000000000001 //b的原码

所以就可以知道b的值为-1。

💡tips:-1的二进制序列在内存中存的补码是全1,反过来,当我们见到全1,也就可以立马反应过来,它的原码是-1.✌

那肯定有人就疑惑了,这个运算符有什么用呢?

"~"的作用举例

13的二进制序列为:

00000000000000000000000000001101

现在,我们想让它的倒数第二位的0变成1(从而使a的值变成15),可以怎么实现呢?

image-20210913185620386

有一个方法我们知道,就是给这一位按位或”一个1,

image-20210913190732637

❓那00000000000000000000000000000010可以怎么得到呢?

我们可以把1向左移一位,即

1<<1

所以,整个就可以这样实现:

a |= (1 << 1);

其中,“|”是“按位或”操作符,“<<”是左移操作符。

int main()
{
	int a = 13;
	a |= (1 << 1);
	printf("%d\n", a);//输出15
	return 0;
}

😘接下来,就要用到“~”操作符了

15的二进制序列为:

00000000000000000000000000001111

现在,我们想让15的二进制序列的倒数第二位的1变成0(从而使它的值变成13),可以怎么实现呢?

image-20210913194422412

我们可以给这一位按位与”一个0,但是其他位不能影响,所以其他位得“按位与”1;

image-20210913195509168

❓那问题是11111111111111111111111111111101怎么得到?

我们可以看到11111111111111111111111111111101是00000000000000000000000000000010的按位取反

也就是说,我们可以给1向左移动一位,再按位取反即可得到。

~(1 << 1)

所以,整个就可以这样实现:

a &= (~(1 << 1));

其中,“&”是“按位或”操作符。

整段代码如下:

int main()
{
	int a = 15;
	a &= (~(1 << 1));
	printf("%d\n", a);//输出13
	return 0;
}

其中,“&”是“按位或”操作符。

整段代码如下:

int main()
{
	int a = 15;
	a &= (~(1 << 1));
	printf("%d\n", a);//输出13
	return 0;
}

以上就是我总结的关于“~”操作符的相关内容
如果对你有帮助,别忘了点赞👍+收藏
欢迎大家的指导
我的主页还有其他内容,关注❤我,我们一起学习一起成长!


点击全文阅读


本文链接:http://zhangshiyu.com/post/29982.html

补码  反码  操作  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1