C语言之位运算

1.编程实现:两个int(32位)整数m和n的二进制表达中有多少个位(bit)不同?

    输入例子:1999和2299  输出例子:7.
 代码实现:
 #define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

int main()

{

int count=0;

int i=0;

int n=0;

int m=0;

int arr1[32]={0};

int arr2[32]={0};

printf("请输入两个整形数据:\n");

scanf("%d%d",&n,&m);

for(i=0;i<32;i++)

{

arr1[i]=((n>>i)&1);

arr2[i]=((m>>i)&1);

if(arr1[i] != arr2[i])

{

count++;

}

}

printf("共有%d个位不同\n",count);

system("pause");

return 0;

C语言之位运算_第1张图片

2.编写函数返回一个值二进制位模式从左到右翻转后的值

    输入例子:            25                      00000000 00000000 00000000 00011001

    翻转后例子: 2550136832              10011000 00000000 00000000 00000000,输出2550136832

 #define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

unsigned int reverse_bit(unsigned int num)

{

int ret=0;

int i=0;

for(i=0;i<32;i++)  

{

ret+=(num&1)<<(31-i);

num>>=1;

}

return ret;

}

int main()

{

int src=0;

unsigned int num=0;

printf("请输入一个整形数据:\n");

scanf("%d",&num);

src=reverse_bit(num);

printf("翻转后的数字为:\n%u\n",src);

system("pause");

return 0;

C语言之位运算_第2张图片

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

 #define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

int aver(int num1,int num2)

{

int mid=0;

//mid=((num1-num2)/2+num2);

mid=(num1 & num2)+((num1^num2)>>1);

return mid;

}

int main()

{

int src=0;

int num1=0;

int num2=0;

printf("请输入两个整形数据:");

scanf("%d%d",&num1,&num2);

src=aver(num1,num2);

printf("平均数为:%d\n",src);

system("pause");

return 0;

C语言之位运算_第3张图片

4.一组数据中只有一个数字出现了一次,其他谁有数字都是成对出现的,请找出这个数字

 #define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

int main()

{

int i=0;

char ret=0;

char arr1[10];

gets(arr1);

for(i=0;i<sizeof(arr1)/sizeof(arr1[0]);i++)

{

ret^=arr1[i];

}

printf("%c没有匹配成功\n",ret);

system("pause");

return 0;

C语言之位运算_第4张图片

你可能感兴趣的:(位运算,编程,函数,二进制,32位)