日常代码练习

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

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

```
#include<stdio.h>
#include<math.h>
unsigned int reverse_bit(unsigned int n)
{
unsigned int sum = 0;
int i = 0;
for(i=0; i<32; i++)
{
sum += ((n >> i) & 1) * pow(2, 31-i);
}
return sum;
}


int main()
{
    unsigned int n = 7;
    
printf("%u", reverse_bit(n));
system("pause");
        return 0;
}

```

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

`#include<stdio.h>``
int mid(int a, int b)
{
return b+(a-b)/2;
}
int mid_2(int a, int b)
{
return (a&b) + ((a^b)>>1);
}


int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
printf("%d", mid(a, b));

return 0;
}
```

3.编程实现: 
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 
请找出这个数字。(使用位运算) 

`#include<stdio.h>``
int the_math(int arr[], int sz)
{
    int ret = 0;
int i = 0;
for(i=0; i<sz; i++)
{
    ret = arr[i]^ret;
}
return ret;
}


int main()
{
    int sz = 0;
    int arr[] = {1, 1, 2, 2, 3, 3, 4};
    sz = sizeof(arr)/sizeof(arr[0]);
    printf("%d",  the_math(arr,sz))
return 0;
}

```

4. 
有一个字符数组的内容为:"student a am i", 
请你将数组的内容改为"i am a student". 
要求: 
不能使用库函数。 
只能开辟有限个空间(空间个数和字符串的长度无关)。 

``#include<stdio.h>`
int m_strlen(char* str)
{
    int count = 0;
while(*str++)
{
    count++;
}
return count;
}


void reverse_str(char* start, char* end)
{
char tem = 0;
while(start < end)
{
    tem = *end;
    *end = *start;
 *start = tem;
*start++;
*end--;
}
}


void reverse(char* str)
{
char* start = str;
char* end = str + m_strlen(str) - 1;
char* cur_start = str;
reverse_str(start, end);
while(*cur_start)
{
char* start = cur_start;
while((*cur_start != ' ')&&(*cur_start != '\0'))
{
cur_start++;
}
reverse_str(start,cur_start - 1);
if(*cur_start == ' ')
{
cur_start++;
}
}
}

int main()
{
    char str[50];
    gets(str);
    reverse(str);
printf("%s", str);
system("pause");
return 0;
}
```
 

猜你喜欢

转载自blog.csdn.net/weixin_43223497/article/details/83549880
今日推荐