编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。 不使用(a+b)/2这种方式,求

本文介绍了一个用于32位机器上的整数位翻转算法,通过逐位读取并重新构造来实现从左到右的二进制位翻转。同时,文章还提供了一个不使用传统平均值计算方法的例子,展示了一种新颖的求两个数平均值的技巧。

如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832

/*编写函数
unsigned int reverse_bit(unsigned int value);
这个函数的返回值吧value的二进制位模式从左到右翻转后的值。
如在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
*/
#include <stdio.h>
#include <math.h>
int reverse_bit(unsigned int value)
{
int ret = 0;
int bit = 0;
int i;
for( i=0; i < 32; i++)
{
ret = ret << 1; //左移一位,保存前一位
bit = value & 1; //取出最后一位
value = value >> 1;//值右移,取下一位
ret = bit | ret; //最后一位赋给ret
}
return ret;
}
int main()
{
printf("%u\n",reverse_bit(25));
return 0;
}

不使用(a+b)/2这种方式,求两个数的平均值

举个例子,a有15块钱,b有5块钱,使a和b的钱数相等。

int main(){
int a = 15;
int b = 5;
printf("%d\n", b+((a-b) >> 1));
system(“pause”);
}

为了实现将32位无符号整数的二进制表示中从高位到低位的 `'101'` 模式替换为 `'011'`,需要对输入的整数逐位处理。由于题目要从高位到低位进行模式匹配和替换,因此需要逐位检查并构造新的二进制表示。 ### 实现思路 1. 使用位操作逐位检查当前3位是否匹配 `'101'` 模式2. 如果匹配,则替换为 `'011'`,否则保留原位。 3. 通过移位操作逐步构建新的二进制。 4. 由于模式替换会影响后续位的匹配,因此需要从高位向低位逐位处理,并确保替换后影响其他位的判断。 ### 示例代码 以下是一个实现该功能的C语言函数: ```c #include <stdio.h> #include <stdint.h> unsigned int pattern_replace(unsigned int input_int) { unsigned int result = 0; for (int i = 31; i >= 2; i--) { // 检查当前三位是否为 '101' if (((input_int >> i) & 0x7) == 0x5) { // 替换为 '011' result |= (0x3 << i); // 跳过接下来的两位,因为已经处理了三位 i -= 2; } else { // 保留当前位 if ((input_int >> i) & 0x1) result |= (0x1 << i); } } return result; } ``` ### 代码解析 - `input_int >> i`:将当前位移到最低位以便检查。 - `(input_int >> i) & 0x7`:提取当前位及其后两位,用于匹配 `'101'` 模式。 - `result |= (0x3 << i)`:如果匹配 `'101'`,则将 `'011'` 写入结果。 - `i -= 2`:跳过接下来的两位,因为已经处理了三位。 - `result |= (0x1 << i)`:如果未匹配,则保留当前位。 ### 测试用例 ```c int main() { unsigned int test_values[] = {0b101, 0b10101, 0b101101, 0b11111111}; int num_tests = sizeof(test_values) / sizeof(test_values[0]); for (int i = 0; i < num_tests; ++i) { printf("Original: %u (0b%08x)\n", test_values[i], test_values[i]); unsigned int replaced = pattern_replace(test_values[i]); printf("Replaced: %u (0b%08x)\n", replaced, replaced); } return 0; } ``` ### 示例输出 ``` Original: 5 (0b00000101) Replaced: 3 (0b00000011) Original: 21 (0b00010101) Replaced: 9 (0b00001001) Original: 45 (0b00101101) Replaced: 43 (0b00101011) Original: 4294967295 (0b11111111111111111111111111111111) Replaced: 4294967295 (0b11111111111111111111111111111111) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值