目录
基本知识
我们常用十进制,计算机内部存储的是二进制,用位运算会快一点。在需要大量运算是,位运算能节省时间,提高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 %d\n", 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进行“&”操作,可以用来得到二进制。
位置 | 4 | 3 | 2 | 1 | 0 |
整数(十进制) | 20 | ||||
二进制 | 1 | 0 | 1 | 0 | 0 |
代码
//取十进制整型变量a的二进制形式的第k位
int GetWei(int n, int k)
{
int m;
m = n >> k & 1;
return m;
}
全部代码
/*
Project: bitwise_useful(位运算的妙用)
Date: 2019/03/01
Author: 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 %d\n", a, b);
}
//乘或除2的次
void MulOrDe()
{
int num, n;
printf("请输入一个整数:\n");
scanf("%d", &num);
printf("请输入次数:\n");
scanf("%d", &n);
printf("%d乘2的%d次等于%d\n", num, n, Multi(num, n));
printf("%d除2的%d次等于%d\n", 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次取余等于%d\n", 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;
}
实验结果截图
更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。