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

~操作符含义及用处举例

"~"的含义

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

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

一起来看下面这段代码:

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;
}

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

  • 41
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值