算法进阶:0x01 位运算

Posted longxue1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法进阶:0x01 位运算相关的知识,希望对你有一定的参考价值。

1、快速幂的模板代码

#include<iostream>
using namespace std;
int main()
{
    int a,b,p;
    cin>>a>>b>>p;
    int res = 1 % p;
    while (b)
    {
        if (b & 1) res = res * 1ll * a % p;
        b >>= 1;
        a = a * 1ll * a % p;
    }
    cout<<res<<endl;
}

注意点:

1、转换成long long类型可以直接乘1ll,作用与(long long)相同,范围大概为10^19,int为2 147 483 647。

2、以2^7为例,7 = 4(2^2) + 2(2^1) + 1(2^0);二进制形式为111,b&1为获取最后一位是否为1,b>>=1舍弃最后一位。

3、如果测试数据为123456789 0 1,res=1没有%p的话,那么结果就是1,正确应为0,所以应该初始化res就%p。

 4、memset(a, val, sizeof(a))把数值val(0x00~0xFF)填充到数组a的每个字节上,一个int占用4个字节,所以用memset只能赋值出“每8位都相同”的int。0x3F3F3F3F(1 061 109 567)的两倍不超过0x7F7F7F7F(2 147 483 647),memset(a, 0x3F, sizeof(a))。0xFFFFFFFF为-1。

以上是关于算法进阶:0x01 位运算的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛进阶指南基本算法-位运算

《算法零基础100讲》(第45讲) 位运算 (位或) 进阶

《算法零基础100讲》(第47讲) 位运算 (异或) 进阶

0x01 位运算

位运算简介及实用技巧:进阶篇[转]

每日算法&面试题,大厂特训二十八天——第九天(位运算)