目录
基本知识
四个妙用
1.判断整型变量奇偶
原理
代码
2.交换变量
原理
代码
3.乘/除2的n次
原理
代码
4.对2的次幂取余
原理
代码
5.得到整型变量二进制形式某位置的值
原理
代码
全部代码
实验结果截图
基本知识
我们常用十进制,计算机内部存储的是二进制,用位运算会快一点。在需要大量运算是,位运算能节省时间,提高oj的通过率。
四个妙用 1.判断整型变量奇偶使用位运算符:&
原理2的0次是1,2的1次是2。根据按权展开可知,只需判断最后一位即可。1的二进制是000...001。根据&运算符的特点,奇数末位是1,和1与为1,偶数则为0。
代码 //判断int类型变量奇偶bool Judge(int n){return(n&1);//奇数返回1,偶数返回0} 2.交换变量使用位运算符:^
原理两个数相同,则返回0,否则,返回1。a=a^b;b=(a^b)^b=a;a=(a^b)^a=b;
代码 //交换变量 利用异或void Change(){int a, b;printf("请输入两个整数:n");scanf("%d %d",&a,&b);printf("%d %d交换后为:", a, b);a ^= b;b ^= a;a ^= b;printf("%d %dn", a, b);} 3.乘/除2的n次使用位运算符:<<和>> 乘用的比较多
原理移位。不溢出的情况下,左移补0,就是乘2了。除是右移,类似,但是可能损失精度。
代码 //num乘2的n次int Multi(int num, int n){return num << n;}//num除2的n次int Devide(int num, int n){return num >> n;} 4.对2的次幂取余使用位运算符:&
原理例如,15对8取余,15的二进制是00...01111 最多就是余7喽。8-1就是7,二进制为00...111,和00...0111相与就是余数7。
代码 //得到余数int Yu(int num,int n){int i = 1 << n;return num&(i-1);} 5.得到整型变量二进制形式某位置的值 原理向右移位与1进行“&”操作,可以用来得到二进制。
位置43210整数(十进制) 20二进制10100 代码 //取十进制整型变量a的二进制形式的第k位int GetWei(int n, int k){int m;m = n >> k & 1;return m;} 全部代码 /*Project: bitwise_useful(位运算的妙用)Date: 2019/03/01Author: Frank Yu*/#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<string>#include<set>#include<list>#include<vector>#include<map>#include<stack>#include<iterator>#include<algorithm>#include<iostream>using namespace std;#define F(i,m,n) for(int i=m;i<n;i++)//***************************基本操作函数*********************************////判断int类型变量奇偶bool Judge(int n){return(n & 1);//奇数返回1,偶数返回0}//取十进制整型变量a的二进制形式的第k位int GetWei(int n, int k){int m;m = n >> k & 1;return m;}//num乘2的n次int Multi(int num, int n){return num << n;}//num除2的n次int Devide(int num, int n){return num >> n;}//得到余数int Yu(int num, int n){int i = 1 << n;return num&(i - 1);}//****************************功能实现函数*********************************////菜单void menu(){printf("********1.判断整型变量奇偶 2.交换变量*********n");printf("********3.乘/除2的n次 4.对2的次幂取余*********n");printf("********5.取整型变量a的二进制第k位 6.退出*********n");}//判断奇偶void OddOrEven(){int n;printf("请输入一个整数:n");scanf("%d", &n);if (Judge(n)) printf("%d是一个奇数!n", n);else printf("%d是一个偶数!n", n);}//交换变量 利用异或void Change(){int a, b;printf("请输入两个整数:n");scanf("%d %d", &a, &b);printf("%d %d交换后为:", a, b);a ^= b;b ^= a;a ^= b;printf("%d %dn", a, b);}//乘或除2的次void MulOrDe(){int num, n;printf("请输入一个整数:n");scanf("%d", &num);printf("请输入次数:n");scanf("%d", &n);printf("%d乘2的%d次等于%dn", num, n, Multi(num, n));printf("%d除2的%d次等于%dn", num, n, Devide(num, n));}//取余 a%b b为2的多少次时可以void QuYu(){int num, n;printf("请输入一个整数:n");scanf("%d", &num);printf("请输入次数:n");scanf("%d", &n);printf("%d对2的%d次取余等于%dn", num, n, Yu(num, n));}//得到第k位void Wei(){int n, k;printf("请输入一个整数:n");scanf("%d", &n);printf("请输入要获取第几位:n");scanf("%d", &k);printf("%d的第%d位是%d!n", n, k, GetWei(n, k));}//主函数int main(){int choice;while (1){menu();printf("请输入菜单序号:n");scanf("%d", &choice);if (6 == choice) break;switch (choice){case 1:OddOrEven(); break;case 2:Change(); break;case 3:MulOrDe(); break;case 4:QuYu(); break;case 5:Wei(); break;default:printf("输入错误!!!n"); break;}}return 0;} 实验结果截图 实验结果截图 实验结果截图更多数据结构与算法实现:数据结构(甜美的诺言版)与算法的实现(含全部代码)
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。