欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

:unsigned int reverse_bit(unsigned int value); //这个函数的返回值value的二进制位模式从左到右翻转后的值

程序员文章站 2022-07-15 10:17:53
...
//4:有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 
#include <stdio.h>  
#include<windows.h>
#include <string.h>  
//把每次解析出来的单词翻转  
void fanw(char *l, char *r)
{
	char* left = l;
	char* right = r;
	char temp;
	while (left < right)
	{
		temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
//解析出来每个单词  
void fans(char *p)
{

	while (*p != '\0')
	{
		char *pst = p;
		while (*p != '\0' && *p != ' ')
		{
			p++;
		}
		fanw(pst, p - 1);
		p++;
	}
}

int main()
{
	char p[30] = "student a am i";
	int len = strlen(p);
	printf("原字符串是:%s\n", p);
	printf("翻转后的字符串是:");
	fanw(p, p + len - 1);
	fans(p);
	printf("%s\n", p);
	system("pause");
	return 0;
}
//3:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 
//请找出这个数字。(使用位运算)
/*#include<stdio.h>
#include<windows.h>
int main()
{
	int a[] = { 1, 2, 6, 5, 5, 8, 1, 9, 6, 4, 4, 8, 9 };
	int size = sizeof(a) / sizeof(a[0]);
	int i = 0;
	for (i=1; i < size; i++)
	{
		a[0] ^= a[i];//用按位异或可以得到两个数A,B不同部分C,再接着用C异或B可以得到A
	}
	printf("different num:%d\n", a[0]);
	system("pause");
	return 0;
}*/
//2:不使用(a+b)/2这种方式,求两个数的平均值。
//方法1
/*#include <stdio.h>  
#include <windows.h>  

int main()
{
	int a = 25;
	int b = 5;
	printf("%d\n", (a&b) + ((a^b) >> 1));//左移相当于乘2,右移相当于除以2
	system("pause");//按位与找相同部分,按位异或找不同部分
	return 0;
}*///相同部分加上不同部分的二分之一
//方法2
/*2:#include<stdio.h>
#include<windows.h>
int fun(int a, int b)
{
	int average = 0;
	average = (a + b) >> 1;
	return average;
}
int main()
{
	int a, b;
	int average;
	printf("please enter two nums:");
	scanf_s("%d %d\n", &a, &b);
	average = fun(a, b);
	printf("%d\n", average);
	system("pause");
	return 0;
}*///存在溢出问题,当A,B无限大时,此方法不适用
//1:unsigned int reverse_bit(unsigned int value); 
//这个函数的返回值value的二进制位模式从左到右翻转后的值。
/*#include<stdio.h>
#include<windows.h>
#include<math.h>  

unsigned int reverse_bit(unsigned int value)
{
	int ret=0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		ret += ((value >> i) & 1)*pow(2.0, 31 - i); //实际上没有翻转,只是从最低位向最高位扩展求得  
	}
	return ret;
}

int main()
{
	unsigned int value, back;
	printf("请输入一个整数:");
	scanf_s("%u", &value);
	back = reverse_bit(value);
	printf("翻转后的值为:%u\n", back);
	system("pause");
	return 0;
}*/