逆置一个数的二进制序列

在这里我给大家提供了两种方法来实现这个问题

方法一:主要思想是通过按位与&右移将二进制的每一位放在一个数组中,然后输出就ok了

void reverse_bit(unsigned int data)    //逆置一个数的二进制序列(法一)
{
	int arr[32];
	int i = 0;
	while (i<32)
	{
		if (data & 1)
		{
			arr[i] = 1;
			i++;
		}
		else 
		{
			arr[i] = 0;
			i++;
		}
		data = data >> 1;
	}
	for (i = 0; i < 32; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
int main()
{
	int x = 0;
	printf("please input:\n");
	scanf("%d", &x);
	reverse_bit(x);
	return 0;
}

方法二:这个方法比起上一种方法更巧妙,如果面试中凭借上一种方法能进入百度,这个可以让你进入谷歌。这种方法思考起来相比比较麻烦,但也不难。首先按位与(&),从最高位开始,如果结果不为零,就将按位或(|),因为i与(31-i)是对称的,也就起到了逆置效果。

比如:   data的二进制:0010 0000 0000 0000 0000 0000 0000 0000

      当i=0时:   & 1000 0000 0000 0000 0000 0000 0000 0000   与是有0为0,这时结果为零,

     当i=2时      0010 0000 0000 0000 0000 0000 0000 0000    这时结果是0010 0000 0000 。。主要是确定i=2;

   所以执行按位或 0000 0000 0000 0000 0000 0000 0000 0000

     (1<<i).  0000 0000 0000 0000 0000 0000 0000 0100

或为有1为1,结果为:0000 0000 0000 0000 0000 0000 0000 0100

结束,比较第一列和最后一列,是不是完成了逆置?

unsigned int reverse_bit(unsigned int data)   //逆置二进制序列(法二)
{
	unsigned int rdata = 0;
	int i = 0;
	while (i < 32)
	{
		if (data&(1 << (31 - i)))   //结果不为零
		{
			rdata |= (1<<i);
		}
		i++;
	}
	return rdata;
}
int main()
{
	int x = 0;
	int ret = 0;
	printf("please input:\n");
	scanf("%d",&x);
	ret = reverse_bit(x);
	printf("%u",ret);
	return 0;
}

有不懂得的地方,欢迎留言
### 计算机二级 C语言 程序填空题解答示例 #### 示例一:字符串反转函 以下是基于引用[1]中的代码实现的一个字符串反转函 `fun` 的解析: 该函通过交换字符组两端的元素来完成字符串的原地反转操作。具体逻辑如下: - 定义变量 `i`, `m`, 和 `n`,其中 `n` 表示字符串长度减一。 - 使用循环逐步将首尾字符互换位。 ```c void fun(char *s) { char ch; int i, m, n; i = 0; m = n = strlen(s) - 1; // 初始化索引指针 while (i < (n + 1) / 2) { // 循环条件控制中间点 ch = s[i]; s[i] = s[m]; // 字符交换 s[m] = ch; i++; m--; } } ``` 上述代码实现了字符串的功能[^1]。 --- #### 示例二:斐波那契列递归求解 根据引用[2]的内容,下面是一个用于计算斐波那契列第 `n` 项值的递归函 `fun` 的解释: 此函利用递归方法逐层调用自身以获取前两项之和作为当前项的结果。需要注意的是,在实际应用中,这种递归方式效率较低,因为它会重复计算相同的子问题多次。 ```c #include <stdio.h> long fun(int g) { switch (g) { // 判断输入参的情况 case 0: // 基础情况处理 return 0; case 1: case 2: return 1; } return fun(g - 1) + fun(g - 2); // 递推关系表达式 } void main() { long fib; int n; printf("Input n: "); scanf("%d", &n); printf("n = %d\n", n); fib = fun(n); printf("fib = %ld\n\n", fib); } ``` 以上代码展示了如何使用递归来解决斐波那契序列的问题[^2]。 --- #### 关于选择结构的应用实例 依据引用[3]的信息,这里提供了一个简单的例子说明如何正确运用格式化输出语句打印整型变量 `s` 的十进制形式: ```c printf("s 的值是%d", s); ``` 这是因为在标准C库中,`%d` 是用来表示有符号十进制整的标准占位符之一[^3]。 对于布尔判断部分,可以参考引用[4]提到的例子理解不同值条件下分支执行路径的选择机制。例如当测试 `-1` 或者其他非零值时均会被视为真(true),而仅当检测到确切的零(`0`)才判定为假(false)[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值