1.使用宏实现两个数中求较大值
#define MAX(a,b) (a)>(b)?(a):(b)
int main()
{
int max = MAX(3,4);
printf("max = %d\n",max);
return 0;
}
2.写一个宏可以将一个数字的奇数位和偶数位交换
#define SWAP(num) (num = ((num & 0xaaaaaaaa) >> 1) | ((num & 0x55555555) << 1))
int main()
{
int num = 30;
SWAP(num);
printf("%d\n",num);
return 0;
}
3.////编写函数:
////unsigned int reverse_bit(unsigned int value);
////这个函数的返回 值value的二进制位模式从左到右翻转后的值。
////
////如:
////在32位机器上25这个值包含下列各位:
////00000000000000000000000000011001
////翻转后:(2550136832)
////10011000000000000000000000000000
////程序结果返回:
////2550136832
typedef unsigned int unit;
#include<math.h>
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
unsigned int num = 0;
for(i=0;i<32;i++)
{
//num = (unit)(num + ((value >> i) & 1) * pow(2,32-i-1));
num |= ((value >> i) & 1) << (31 - i); //效率更高 (拿到那一位将它左移到对应位,进行 或等 就会得到翻转的值)
}
return num;
}
int main()
{
unsigned int i = 0;
unsigned int ret = 0;
scanf("%d",&i); //不能写成 scanf("%u",%i); 程序会崩溃
ret = reverse_bit(i);
printf("%u\n",ret);
//printf("%d\n",sizeof(unit));
return 0;
}
4.不使用(a+b)/2这种方式,求两个数的平均值
//方法一
int Average(int x, int y)
{
return y+(x-y)/2;
}
//方法二
00001010 10
00010100 20
00000000 &
00011110 ^
00001111 ^ >>1
//首先,&得到的数字位,只有两个1才得到1,就是进位的1,
//而本该向前进一位的1待在了本位。实际上
//应该让得到的结果左移1(让进位的1进到合适的位置),
//然后再右移1(除以2),得到进位的平均数。
//然后,^得到的数字位,实际得到的是本位得到的结果(不包括进位),
//让他右移1,得到本位的平均数。
//两个平均数相加,得到整个数完整的平均数。
#include<math.h>
int Average(int x, int y)
{
return (x & y) + ((x ^ y) >> 1); //(x&y) x和y相同位的平均值 (x^y)>>1 x和y不同位的平均值
}
int main()
{
int a = 25;
int b = 15;
int ret = 0;
ret = Average(a,b);
printf("%d\n",ret);
return 0;
}
5.////编程实现:
////一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
////请找出这个数字。(使用位运算)
int look_out(int *a, int len)
{
int i = 0;
int ret = 0;
for(i=0;i
//求字符串长度
int my_strlen(const char *dst)
{
int count = 0;
while(*dst != '\0')
{
dst++;
count++;
}
return count;
}
////逆序函数
void Reverse(char arr[], int left, int right)
{
while(left<right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
////逆序字符串
char* reverse_str(char arr[])
{
int left = 0;
int right = my_strlen(arr) - 1;
int i = 0;
//先逆序整个字符串
Reverse(arr,left,right);
//逐个逆序单词
while(arr[i] != '\0')
{
left = i;
//逆序一个单词
while((arr[i] != ' ') && arr[i] != '\0') //条件重点理解
{
i++;
}
right = i - 1; //i是空格的下标
Reverse(arr,left,right);
if(arr[i] == ' ') //判断不能少,不然会跳过\0,程序崩溃, 也不能写成 !=
{
i++;
}
}
return arr;
}
int main()
{
char arr[] = "chao li";
reverse_str(arr);
printf("%s\n",arr);
return 0;
}