【C语言-41】 编写函数:unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。

目录

 

解题分析:

代码分析一:

思路:

代码分析二:

运行结果: 


解题分析:

  • 题目要求:
  1. 编写函数: unsigned int reverse_bit(unsigned int value);
  2. 这个函数的返回值value的二进制位模式从左到右翻转后的值。
  3. 如: 在32位机器上25这个值包含下列各位: 00000000 00000000 00000000 00011001
  4. 翻转后:(2550136832)10011000 00000000 00000000 00000000
  5. 程序结果返回: 2550136832

代码分析一:

思路:

  1. 首先将整数的每一位提取出来,乘以该位的权值,在依次相加;
  2. 例如第一次提出的1的权值为2^31,相乘的结果即为2^32,
  3. 接下来每提出一次0或1,其权值在原来的基础上除以2。
  4. 而要将求第i位的值,只需将这个整数的二进制序列向右移i-1位,再和1进行按位与操作,即(value>>i-1)&1。
  5.  
  6. 
    #include <stdio.h>
    
    #include <math.h>
    
    
    
    unsigned int reverse_bit(unsigned int value)
    
    {
    
    	int i = 0;
    
    	int sum = 0;
    
    	int b = 0;
    
    	for (i = 0; i < 32; i++)
    
    	{
    
    		b = ((value >> i) & 1)*pow(2, 31 - i);
    
    		sum += b;
    
    	}
    
    	return sum;
    
    }
    
    
    
    int main()
    
    {
    
    	int a = 25;
    
    	int ret = 0;
    
    	ret = reverse_bit(a);
    
    	printf("%u\n", ret);
    	system("pause");
    
    	return 0;
    }
    

    代码分析二:

  7.   
  8. 将提出的第一位左移31位,
  9. 第二位左移30位……
  10. 依次类推,将左移后的结果进行按位或运算即可得到最终结果。
     
  11.  
  12. 
    #include <stdio.h>
    #include<stdlib.h>
    unsigned int reverse_bit(unsigned int value)
    
    {
    
    	int i = 0;
    
    	int ret = 0;
    
    	for (i = 0; i < 32; i++)
    
    	{
    
    		if (value >> i & 1)
    
    		{
    
    			ret |= (value >> i & 1) << (31 - i);
    
    		}
    
    	}
    
    	return ret;
    
    }
    
    
    
    int main()
    
    {
    
    	int a = 25;
    
    	int ret = 0;
    
    	ret = reverse_bit(a);
    
    	printf("%u\n", ret);//此处一定要用%u而不是%d,最高位代表的是符号位,%d为输出有符号整数。
    	system("pause");
    
    	return 0;
    
    }
    


    运行结果: 

猜你喜欢

转载自blog.csdn.net/weixin_44749767/article/details/89317765
今日推荐