前言
🎈大家好,我是何小侠🎈
🌀大家可以叫我**小何或者小侠🌀**
🔴我是一名普通的博客写作者🔴
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸
🍃我的主页:何小侠的主页🍃
这篇博客我们一起来学习C语言中操作符的一些理解和技巧,可能不会涵盖所有操作符,但是应该会让你有所收获。
移位操作符🍊
移位操作符又分左移操作符和右移操作符
<< 左移操作符 | >> 右移操作符 |
注意:移位操作符的操作数只能是整数。
左移操作符🍊
左移操作符操作的其实是操作数的二进制位,
操作规则是左边丢弃,右边补0
首先我们先介绍一些基本知识
然后我们再来看实际的代码:
#include<stdio.h> int main() { int a = 5; int b = a << 1; printf("%d\n", a); printf("%d", b); return 0; }
我们看看这行代码的答案
结果 a = 5 ,b = 10,这两个数很巧,这其中会不会有什么关系呢?
我们大胆猜测只要 左移1位就是将这个数扩大两倍。
接下来我们看看二进制位的变化,来证明这个猜测。
或者写清楚点 2^1(2 ^ 2 + 2 ^ 0) = 2 ^ 3 + 2 ^ 1.
相信大家看这张图就应该能够理解了。
然后我们讨论为a = -5 的情况。
#include<stdio.h> int main() { int a = -5; int b = a << 1; printf("%d\n", a); printf("%d", b); return 0; }
我们还是用图来讲解:
其实还是相当于乘了一个2,
右移操作符🍊
移位规则:
首先右移运算分两种:
- 逻辑移位
左边用0填充,右边丢弃 - 算术移位
左边用原该值的符号位填充,右边丢弃’算术右移和逻辑右移取决于编译器,一般都是算术右移,我用的VS也是算术右移。
我们依旧是先上代码
int main() { int a = 5; int b = a >> 1; //00000000000000000000000000000101 printf("a=%d b=%d\n", a, b); return 0; }
结果是
我们还是大胆猜测是不是除过二就行了,我们先画图研究这个过程
如果你还是不相信可以自己试一试.
接下来我们看负数
这里的技巧是,把 (a + (-1)) / 2 就行了。
位操作符🍊
& 按位与
| 按位或
^ 按位异或
这三个也全都是操作二进制位,所以
他们的操作数必须是整数。
&
int main() { int a = 3; int b = -5; int c = a & b; //00000000000000000000000000000011 -> 3的补码 //11111111111111111111111111111011 -> -5的补码 //& 00000000000000000000000000000011 (相同为1,相异为0) //10000000000000000000000000000101 -> -5的原码 //11111111111111111111111111111010 -> -5的反码 printf("%d\n", c); }
|
int main() { int a = 3; int b = -5; int c = a | b; //00000000000000000000000000000011 -> 3的补码 //11111111111111111111111111111011 -> -5的补码 //| 11111111111111111111111111111011 (有1为1,无1为0)补码还需要转换为原码 //10000000000000000000000000000101 -> -5的原码 //11111111111111111111111111111010 -> -5的反码 printf("%d\n", c); }
^
int main() { int a = 3; int b = -5; int c = a ^ b; //00000000000000000000000000000011 -> 3的补码 //11111111111111111111111111111011 -> -5的补码 //^ 11111111111111111111111111111000 // 11111111111111111111111111110111 反码 // 10000000000000000000000000001000 原码 //10000000000000000000000000000101 -> -5的原码 //11111111111111111111111111111010 -> -5的反码 printf("%d\n", c); }
最后我们要说^的技巧
^的技巧
🍊
如果一个a = 5
那么a ^ a = 0.
如果a ^ 0 = a .
最后来一个经典的提莫
现在有一个数组放了一个单身狗个单身狗,1 2 3 4 5 1 2 3 4找出这个单身狗。
方法,将所有的数异或最后就变成了5^0就是5
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,1,2,3,4,5 }; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; int j = arr[0]; for (i = 1; i < sz; i++) { j ^= arr[i]; } printf("%d", j); return 0; }
总结🍊
这篇博客我们介绍了移位操作符,和位操作符的技巧,希望能加强我们对于二进制的理解和熟练程度。
最后如果这篇博客有帮助到你,欢迎点赞关注加收藏
如果本文有任何错误或者有疑点欢迎在评论区评论