快速幂&二进制&位运算

好的标题就告诉我们该来的还是会来,学了十几年十进制现在告诉我要学二进制,但是这个东西很重要很重要,所以还是要重点记

part 1:什么是二进制呢

二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于1679年发明。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是 “逢二进一”,借位规则是 “借一当二”。二进制数据是采用位置计数法,其位权是以2为底的幂。(所有的十进制数字都可以用2的n次方加2的m次方加…来表示)

part 2:十进制与二进制的相互转化
十进制整数转二进制数:“除以2取余,逆序排列”
十进制小数转二进制数:“乘以2取整,顺序排列”(是不是有个疑问这样的话有的数就永远也乘不完了,是的就是乘不完,所以一般会保留小数点后几位什么的)
eg: (整数)
89==>1011001
89÷2 ……1
44÷2 ……0
22÷2 ……0
11÷2 ……1
5÷2 ……1
2÷2 ……0
1… … …1

二进制数转十进制数:按权展开求和
eg:这里的括号外面的数表示这是几进制的数
在这里插入图片描述
(以上都是我从度娘手中得知的)

part 3:位运算
首先还是搞明白什么东西是位运算,位运算就是计算机中专门用于二进制的运算,其中包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上是六个位运算符号的简单介绍(ppt是我们老师给我们上课用的咳)

位运算符的优先级顺序(由高到低)(其实可以不记,用的时候打括号就好了)
在这里插入图片描述
part 4:快速幂
说了这么久终于到了正题,那么什么是快速幂呢,我们知道要求一个数的n次方可以用for循环不断的累积,但是这个所需要的时间是很长的(咱也没学过咱也不敢说),如果用快速幂可以节省很多时间的,所以快速幂就是一个用于很快的求一个数的n次方的东西。
快速幂有好多好多版本,以下是我们老师说的一种

int power(int a,int b)
{
	int ans=1;
	for(;b;b=b>>1)//这里的中间单独一个b是判断b是否不为零 
	{
		if(b&1)ans=ans*a;
		a=a*a;
	}
	return ans;
}

举个栗子
比如说求a的11次方,11转化成二进制是1011,那么就是a的1011次方(注意不要搞混了!是二进制中的1011)

  • part 1:1011&1=1;ans=a;a=a2
  • part 2:b=101;101&1=1;ans=a 3; a=a4
  • part 3:b=10;10&1=0;ans=a3;a=a8
  • part 4:b=1;1&1=1;ans=a11;a=a22
  • part 5:return ans;

快速幂是个令人头秃的东西,虽然也不是很难理解,但要注意有的地方特别的bt……题目中用的时候会用^+数字来表示这个数的n次方,但是 ^这个东西也是按位异或的符号,所以要特别看清(按位异或只在二进制的计算中有)
取余运算是快速幂的一种应用(好像要用到数论的东西但是我不会所以就先不说啦),其实只要在每个算式后面加上取模就可以防止在运算过程中数字超出长整型的范围

#include<iostream>
using namespace std;
long long p,b,k,s;
long long power(long long b,long long p,long long k)
{
	long long ans=1%k;
	for(;p;p>>=1)
	{
		if(p&1)ans=ans*b%k;
		b=b*b%k;
	}
	return ans;
}
int main()
{
	cin>>b>>p>>k;
	s=power(b,p,k);
	cout<<b<<"^"<<p<<" mod "<<k<<"="<<s;
	return 0;
}

这是一道来自洛谷的模板题 点此进入
啊大概就是这样了叭qvq

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值