运算符练习小程序
2016-07-17 15:54
471 查看
1.编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#define _CRT_SECURE_NO_WARNINGS 1
2.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
3.不使用(a+b)/2这种方式,求两个数的平均值。
4.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
5.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h> #include<stdlib.h> int diff_bit(int m,int n) { int count=0; int i=0; for(i=0; i<32; i++) { if(((n>>i) & 1) != ((m>>i) &1) ) count++; } return count; } int main() { int m=0,n=0; int ret=0; printf("请输入m和n的值:"); scanf("%d%d",&m,&n); ret=diff_bit(m,n); printf("m和n中有%d个不同的bit位.\n",ret); system("pause"); return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int diff_bit(int m,int n) { int count=0; int tmp=m^n; while(tmp) { if((tmp&1)==1) { count++; } tmp>>=1; } return count; } int main() { int m=0,n=0; int ret=0; printf("请输入m和n的值:"); scanf("%d%d",&m,&n); ret=diff_bit(m,n); printf("m和n中有%d个不同的bit位.\n",ret); system("pause"); return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int diff_bit(int m,int n) { int count=0; int tmp=m^n; while(tmp) { count++; tmp=tmp&(tmp-1); } return count; } int main() { int m=0,n=0; int ret=0; printf("请输入m和n的值:"); scanf("%d%d",&m,&n); ret=diff_bit(m,n); printf("m和n中有%d个不同的bit位.\n",ret); system("pause"); return 0; }
2.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<math.h> unsigned int reverse_bit(unsigned int value) { int i=0; unsigned int ret=0; for(i=0; i<32; i++) { ret+=(int)(((value>>i)&1)*pow(2.0,31-i)); } return ret; } int main() { unsigned int num=0; unsigned int ret=0; printf("请输入你要翻转的数:"); scanf("%d",&num); ret=reverse_bit(num); printf("翻转之后的数为:%u\n",ret); system("pause"); return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> unsigned int reverse_bit(unsigned int value) { int i=0; unsigned int tmp=0; unsigned int ret=0; for(i=0; i<32;i++) { tmp=0; tmp=((value&1)<<(32-i-1)); value>>=1; ret|=tmp; } return ret; } int main() { unsigned int num=0; unsigned int ret=0; printf("请输入你要翻转的数:"); scanf("%d",&num); ret=reverse_bit(num); printf("%u",ret); system("pause"); return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> unsigned int reverse_bit(unsigned int value) { int i=0; unsigned int tmp=0; unsigned int ret=0; for(i=0; i<32; i++) { tmp<<=1; tmp|=((value>>i)&1); } return tmp; } int main() { unsigned int num=0; unsigned int ret=0; printf("请输入你要翻转的数:"); scanf("%d",&num); ret=reverse_bit(num); printf("翻转之后的数为:%u\n",ret); system("pause"); return 0; }
3.不使用(a+b)/2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int aver(int a,int b) { //int aver=a+((b-a)>>1); int aver=(a&b)+((a|b)>>1); return aver; } int main() { int a=3,b=4; int ret=aver(a,b); printf("the average of a and b is:%d",ret); system("pause"); return 0; }
4.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int diff_num(int arr[],int sz) { int i=0; int ret=0; for(i=0; i<sz; i++) { ret^=arr[i]; } return ret; } int main() { int arr[]={1,1,2,3,3,4,4}; int sz=sizeof(arr)/sizeof(arr[0]); int ret=diff_num(arr,sz); printf("the single num is %d\n",ret); system("pause"); return 0; }
5.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> void find_two_diff(int arr[],int sz,int *num1,int *num2)//设置两个返回型参数 { int i = 0; int ret = 0; int pos = 1; *num1 = 0; *num2 = 0; for (i = 0; i < sz; i++) { ret ^= arr[i]; } // 找出ret中1的位置 while (ret) { if ((ret & 1) == 1) { break; } else { pos++; ret >>= 1; } } // 找对应位是1的 for (i = 0; i < sz; ++i) { if (((1 << (pos - 1)) & arr[i]) == 0) { *num1 ^= arr[i]; } else { *num2 ^= arr[i]; } } } int main() { int arr[] = { 1, 2, 3, 1, 2, 3, 4, 5 }; int ret1=0; int ret2=0; find_two_diff(arr, sizeof(arr) / sizeof(arr[0]), &ret1, &ret2); printf("num1 = %d,num2 = %d\n", ret1, ret2); system("pause"); return 0; }
相关文章推荐
- 微信二次分享失败
- 微信服务器ip获取
- 微信授权方法及通过授权获取临时访客的个人信息方法
- 微信的redirect_uri参数错误原因分析
- 如何使用iTunes与iTools导出微信聊天记录
- iOS开发支付集成之微信支付
- 2016年做好企业微信运营的四大关键点
- 微信收费体现的目的是什么
- 如何做好微商城等微信公众平台开发功能营销活动
- 微信开发学习记录 01
- 爬取微信公众号
- ChatForFun 公众号使用说明
- Android 实现长按录音获取实时音量显示图片(类似微信)
- Android微信支付
- IOS微信支付
- 微信jssdk用法汇总
- Android 微信支付接入
- ViewPager + Fragment 实现类微信界面
- Create小程序
- scala的几个小程序