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

C语言 位运算练习

程序员文章站 2022-07-15 08:52:17
...
/编写函数:
//unsigned int reverse_bit(unsigned int value);
//这个函数的返回值value的二进制位模式从左到右翻转后的值。
//
//如:
//在32位机器上25这个值包含下列各位:
//00000000000000000000000000011001
//翻转后:(2550136832)
//10011000000000000000000000000000
//程序结果返回:
//2550136832
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(unsigned int value) {
 unsigned int tmp, num = 0;
 for (int i = 0; i < 32; ++i) {
  tmp = value % 2;
  num = num * 2 + tmp;
  value = value / 2;
 }
 return num;
}
//按"位的思想"
unsigned int reverse_bit(unsigned int value) {
 int tmp, num = 0;
 for (int i = 0; i < 31; ++i) {
  //取出最后一位保存到tmp中
  tmp = value & 1;
  num = num | tmp;
  num = num << 1;
  value = value >> 1;
 }
 return num;
}
int main() {
 unsigned int value;
 scanf("%u", &value);
 printf("%u\n", reverse_bit(value));
 system("pause");
 return 0;
}
//编程实现:
//一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
//请找出这个数字。(使用位运算)
#include<stdio.h>
#include<stdlib.h>
int main() {
 int arr[] = { 0, 0, 11, 11, 2, 3, 3, 9, 5, 9, 5 };
 int res=0;
 for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) {
  res ^= arr[i];
 }
 printf("%d\n", res);
 system("pause");
 return 0;
}
//不使用(a + b)/ 2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
 int a, b;
 scanf("%d %d", &a, &b);
 int i,j,k,m;
 //i是a&b相同的部分
 i = a&b;
 //j是a与b不同的部分
 j = a^b;
 //k=(a-b)/2
 k = j >> 1;
 m = i + k;
 printf("%d\n", m);
 system("pause");
 return 0;
}
//交换两个数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
 int a, b;
 scanf("%d %d", &a, &b);
 a = a^b;
 b = a^b;
 a = a^b;
 printf("%d,%d\n", a, b);
 system("pause");
 return 0;
}