🚵 前言+目录:
对于C语言的初学者来说,遇到 移位操作符、位操作符这些涉及二进制存储的知识的题目,有很多理解不全面的知识点。今天我将以往所遇到的相关题目,整理了出来并向外拓展,给你全面的介绍,看完你也要学会操作符,加油😛😜😝
目录
2.移位操作符
2.1左移操作符
2.2右移操作符
3.位操作符
🌵结语:
🏆🚴二进制在内存中的存储
①整数的二进制表示有三种:原码、 反码、补码
②整数在内存中存储的是补码
③printf 打印的结果是原码、肉眼看见的就是原码
①对于正数:原码、反码、补码相同
②对于负数:原码、反码(原码符号位不变,其他位按位取反得到反码)、补码(反码+1得到补码)
🏆🚴移位操作符(<<、>>、&、|、^)
注意:移位操作符移动的是二进制位,操作数只能是整数,对num移位、移位后num的值不变
🔥左移操作符(<<):
左边丢弃,右边补0
①
int a=7;
a在内存中:
00000000000000000000000000000111 (补码)
int b=a<<1;
b在内存中:
00000000000000000000000000001110 (补码)
printf ("%d",b); 得14
因为是正数,则原反补都相同,再打印
②
int a=-7;
a在内存中:
111111111111111111111111111111111001 (补码)
int b=a<<1;
b在内存中:
111111111111111111111111111111111010 (补码)
printf ("%d",b); 得-14
先将b的补码转换为反码再转换为原码,再打印
🔥右移操作符(>>):
右移操作符分为俩种情况:
算术移位:右边丢弃,左边补原符号位(大部分编译器都是算术移位)
逻辑移位:右边丢弃,左边补0
①
int a=7;
a在内存中:
00000000000000000000000000000111 (补码)
int b=a>>1;
b在内存中:
00000000000000000000000000000011 (补码)
printf ("%d",b); 得3
因为是正数,则原反补都相同,再打印
②
int a=-7;
a在内存中:
111111111111111111111111111111111001 (补码)
int b=a>>1;
b在内存中:
111111111111111111111111111111111100 (补码)
printf ("%d",b); 得-4
要先将b的补码转换为反码再变成原码,原反补都相同
🏆🚴位操作符
注意:移动的是 二进制位
① & 按位与 都为1则是1,否则都为0
② | 按位或 有1则是1,否则都为0
③ ^ 按位异或 相同为0,否则为1
特殊:异或 支持交换律
① a ^ a = 0 ; 0 ^ a = a ;
②交换律:
3 ^ 3 ^ 5 = 5
3 ^ 5 ^ 3 = 5
🏆🚴移位操作符和位操作符搭配
n&(n-1):得到 n 中1的个数
n&1:得到 n 二进制中的最低位 1或0
((n>>i)&1)==1:n不断向右移 i 位,判断最低位是不是1
🔥例题(非常重要):
①求一个整数存储在内存中的二进制中1的个数(求补码的二进制中1的个数)
1. #include <stdio.h> 2. 3. int main() 4. { 5. int i = 0; 6. int num = 0; 7. int count = 0; 8. scanf("%d", &num); 9. for (i = 0; i < 32; i++) 10. { 11. if ((num >> i) & 1 == 1) 12. count++; 13. } 14. printf("%d\n", count); 15. 16. return 0; 17. }
②求俩个数二进制中不同位的个数
1. #include <stdio.h> 2. int count_bit(int m, int n) 3. { 4. int count = 0; 5. int i = 0; 6. for (i = 0; i < 32; i++) 7. { 8. if (((m >> i) & 1) != ((n >> i) & 1)) 9. { 10. count++; 11. } 12. } 13. return count; 14. } 15. int main() 16. { 17. int m = 0; 18. int n = 0; 19. scanf("%d %d", &m, &n); 20. int ret = count_bit(m, n); 21. printf("%d\n", ret); 22. 23. return 0; 24. }
③获取一个整数二进制序列中所有的偶数位和奇数位,并打印
1. #include <stdio.h> 2. int main() 3. { 4. int i = 0; 5. int num = 0; 6. scanf("%d", &num); 7. //获取奇数位 8. for (i = 30; i >= 0; i -= 2) 9. { 10. printf("%d ", (num >> i) & 1); 11. } 12. //获取偶数位 13. for (i = 31; i >= 1; i -= 2) 14. { 15. printf("%d ", (num >> i) & 1); 16. } 17. 18. return 0; 19. }
🚵 结语:
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹