二进制反转

题目描述:

        请编写函数,这个函数的返回值是把value的二进制位模式从左到右变换一下后的值。例如,在32位机器上,25这个值包含下列各个位:

000000000000000000000000000000011001

函数的返回值应该是2550136832,它的二级制位模式是:

100110000000000000000000000000000000

编写函数时要注意不要让他依赖于你的机器上整型值得长度。

 

方法一:利用二进制数转化为十进制数的计算规则来编写,代码如下:

#include<stdio.h>
#include<windows.h>
#include<math.h>
 
unsigned int reverse_bit(int num)
{
	int i = 0;
	unsigned int sum = 0;
	for (i = 0; i < 32; i++)
	{
		sum += ((num >> i) & 1) * pow(2.0, 31 - i);
	}
	return sum;
}
 
int main()
{
	int num = -1;
	unsigned int ret=reverse_bit(num);
	printf("ret=%u\n", ret);//%u 表示无符号10进制整数
	system("pause");
	return 0;
}

这里的(num >> i) & 1意思是依次取这个数二进制位模式下的最右面的那一位数,一共取32次。这样就可以把二进制位模式下的每一位数,都提取出来了。

 

方法二:利用十进制数转化为二进制数的计算规则来编写,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() 
{
	unsigned int n;
        int sn = 2;//表示二进制
	scanf("%u", &n);
	int i;
	unsigned int tmp, sum = 0;
	for (i = 0; i < 32;i++) 
	{
		tmp = n % sn;
		n/=sn;
		sum = sum * sn + tmp;
	}
	printf("%u\n", sum);//%u 表示无符号10进制整数
	return 0;
}

这里利用n%sn得到每一次的余数,也就是依次得到这个数二进制位模式下从左到右的每一位数,并将它存放在tmp中,而这里的 sum=sum*sn+tmp和第一种方法中的pow(2.0,31-i)有着异曲同工之妙。

 

方法三:利用位运算规则来编写,代码如下:

#include<stdio.h>
#include<windows.h>
#include<math.h>
 
unsigned int reverse_bit(int num)
{
	int i = 0;
	int ret = 0;
	for (i = 0; i < 32; i++)
	{
		ret <<= 1;
		ret |=((num >> i) & 1);
	}
	return ret;
}
int main()
{
	int num = 25;
	unsigned int ret=reverse_bit(num);
	printf("ret=%u\n", ret);//%u 表示无符号10进制整数
	system("pause");
	return 0;
}

这里的 ret<<=1 的意思是,将ret向左移一位,而((num >> i) & 1)的意思是依次得到这个数二进制位模式下最右面的那一位数,最后再 |ret,而 ret|((num >> i)&1)的意思是,每次得到这个数二进制位模式下最右面的那一位数后,将这个数变成ret的最右面的那个数。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Python中,可以使用bin()函数将十进制数转化为二进制数。例如,bin(10)将返回'0b1010',表示十进制数10的二进制形式。此外,Python还提供了一些二进制位运算符,如按位与(&)、按位或(|)、按位异或(^)、按位反转(~)、左移动(<<)和右移动(>>)等。这些运算符可以用于对二进制数进行位运算操作。例如,使用按位与运算符(&)可以对两个二进制数的相应位进行与运算,如果相应位数都为1,则该位的结果为1,否则为0。使用按位或运算符(|)可以对两个二进制数的相应位进行或运算,如果相应位数有一个为1,则结果为1;若都为0,则结果为0。使用按位异或运算符(^)可以对两个二进制数的相应位进行异或运算,如果对应位数相异,则结果为1;相同时,结果为0。使用按位反转运算符(~)可以对一个二进制数进行按位翻转,即将每个位取反。使用左移动运算符(<<)可以将一个二进制数的所有位向左移动指定的位数,高位丢弃,低位补0。使用右移动运算符(>>)可以将一个二进制数的所有位向右移动指定的位数,低位丢弃,高位补0。 #### 引用[.reference_title] - *1* [【python】数据类型4-二进制二进制运算符](https://blog.csdn.net/weixin_43098506/article/details/125175797)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值