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

🚵 前言+目录:

对于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的个数)

#include <stdio.h>

int main()
{
	int i = 0;
	int num = 0;
	int count = 0;
	scanf("%d", &num);
	for (i = 0; i < 32; i++)
	{
		if ((num >> i) & 1 == 1)
			count++;
	}
	printf("%d\n", count);

	return 0;
}

求俩个数二进制中不同位的个数 

#include <stdio.h>
int count_bit(int m, int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int ret = count_bit(m, n);
	printf("%d\n", ret);

	return 0;
}

获取一个整数二进制序列中所有的偶数位和奇数位,并打印 

#include <stdio.h>
int main()
{
	int i = 0;
	int num = 0;
	scanf("%d", &num);
	//获取奇数位
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (num >> i) & 1);
	}	
	//获取偶数位
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", (num >> i) & 1);
	}

	return 0;
}

🚵 结语:

如果对您有帮助的话,

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

如果对您有帮助的话,

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

如果对您有帮助的话,

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

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珠江上上上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值