~操作符含义及用处举例
文章目录
- "~"的含义
- "~"的作用举例
"~"的含义
~:对一个数的二进制按位取反。
对整个数,包括符号位都可以按位取反。
一起来看下面这段代码:
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),可以怎么实现呢?
有一个方法我们知道,就是给这一位“按位或”一个1,
❓那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),可以怎么实现呢?
我们可以给这一位“按位与”一个0,但是其他位不能影响,所以其他位得“按位与”1;
❓那问题是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;
}
以上就是我总结的关于“~”操作符的相关内容
如果对你有帮助,别忘了点赞👍+收藏
欢迎大家的指导
我的主页还有其他内容,关注❤我,我们一起学习一起成长!