C语言中的位操作符的应用

来源:互联网 发布:知乎ipad客户端 编辑:程序博客网 时间:2024/05/18 00:56
编写函数: 
unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。
 

如: 
在32位机器上25这个值包含下列各位: 
00000000000000000000000000011001 
翻转后:(2550136832) 
10011000000000000000000000000000 
程序结果返回: 
2550136832 
unsigned int reverse_bit(unsigned int num)     //反转{unsigned int ret = 0;int i = 0;unsigned int y = 0;for (i = 0; i < 32; i++){y = y << 1;//这里要先右移一位,才能保证最高位是num的最低位ret = (num >> i) & 1;y = ret | y;}return y;}int main()//反转一个二进制数{unsigned int num = 0;printf("please enter a num :\n");scanf("%d", &num);printf("%u\n", reverse_bit(num));return 0;}

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

int main(){int a = 20;int b = 10;int c = 0;int d = 0;c = a + ((b - a) >> 1);d = (a&b) + ((a^b) >> 1);     //慎用!printf("%d\n", c);printf("%d\n", d);return 0;
编程实现: 
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)。

int search(int arr[],int len){int key = 0;int i = 0;for (i = 0; i < len; i++){key ^= arr[i];}return key;}/*将数组中的每个数全都取异或运算,最后留下的数就是独数    (注意拓展)(1)a=a^b    c^a相当于c^(a^b)(2)自己异或自己两次相当于没有异或,还是自己。*/int main(){int arr[] = { 1, 2, 3, 4, 4, 2, 3, 5, 5 };int len = sizeof(arr) / sizeof(arr[0]);search(arr,len);printf("%d\n", search(arr, len));system("pause");return 0;}
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 
要求: 
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。

void reverse(char *start, char *end){assert(start);assert(end);while (start < end){char temp = *start;*start = *end;*end = temp;start++;end--;}}void reverse_str(char *str, int sz){assert(str != NULL);               //检测传入的字符串  char *str1 = str;char *left = str;char *right = str + sz - 1;reverse(left, right);         //先将字符串整体反转  while (*str1){left = str1;while ((*str1 != '\0') && (*str1 != ' ')) //找到单词,//此处要加(*str1 != '\0')条件限制,因为找到最后一个单词的时候,*str1永远也不为空格  {str1++;}right = str1 - 1;               //此时str1指向单词后方的空格,需要减一方能指向单词的最后一个字母  reverse(left, right);               //继整体反转后再次反转单词,能使单词拼写顺序恢复过来  if (*str1 == ' ')             //等于空格让指针后移一位否则不能参与下次循环。  {str1++;}}}int main(){char arr[] = "student a am i";int sz = strlen(arr);reverse_str(arr, sz);printf("%s", arr);return 0;}


原创粉丝点击