虎了凿的移位操作符和位操作符

简介: 虎了凿的移位操作符和位操作符

🚵 前言+目录:

对于C语言的初学者来说,遇到 移位操作符、位操作符这些涉及二进制存储的知识的题目,有很多理解不全面的知识点。今天我将以往所遇到的相关题目,整理了出来并向外拓展,给你全面的介绍,看完你也要学会操作符,加油😛😜😝

目录

🌵前言+目录:

1.二进制在内存中的存储

2.移位操作符

       2.1左移操作符

       2.2右移操作符

3.位操作符

4.移位操作符和位操作符搭配

🌵结语:


 

🏆🚴二进制在内存中的存储

①整数的二进制表示有三种:原码、 反码、补码

②整数在内存中存储的是补码

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

🚵 结语:

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

相关文章
|
1月前
|
存储 C语言
【C语言】位与移位操作符详解
【C语言】位与移位操作符详解
【C语言】位与移位操作符详解
|
1月前
|
编译器 C语言
算术操作符+,-,*,/,%
算术操作符+,-,*,/,%
|
1月前
|
C语言
C语言的详解操作符(2)之取余操作符
C语言的详解操作符(2)之取余操作符
|
8月前
|
存储 C语言
C语言操作符[算数操作符,赋值操作符,单目操作符,移位操作符]
C语言操作符[算数操作符,赋值操作符,单目操作符,移位操作符]
|
11天前
|
存储 编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
17 1
|
11天前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
17 3
|
1月前
|
存储 编译器
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
|
1月前
|
C语言
【C语言】位操作符与移位操作符练习
【C语言】位操作符与移位操作符练习
【C语言】位操作符与移位操作符练习
|
1月前
|
存储 C语言
C learning_12 操作符前篇(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)
C learning_12 操作符前篇(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)
|
11月前
|
编译器 C语言 C++
操作符习题
操作符习题