c语言位运算的妙用-程序优化

目录

基本知识

四个妙用

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 %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进行“&”操作,可以用来得到二进制。

位置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/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;
}

实验结果截图

实验结果截图
实验结果截图

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值