位运算 - 六十四位整数乘法

求 a 乘 b 对 p

取模的值。

输入格式

第一行输入整数a

,第二行输入整数b,第三行输入整数p

输出格式

输出一个整数,表示a*b mod p的值。

数据范围

1≤a,b,p≤1018

输入样例:

3
4
5

输出样例:

2

#include <stdio.h>
typedef unsigned long long ULL;
int main()
{
    ULL a,b,p;
    ULL res = 0;
    scanf("%llu%llu%llu",&a,&b,&p);
    while(b)
    {
        if(b&1)
            res = (res+a) % p;
        a = (a + a) %p;
        b >>= 1;
    }
    printf("%llu",res);
}

首先,其别名unsigned long long ULL

b&1 就是 判断b的最低位是否为1,如果为1,就加到res(最终结果);; 这里的b就是一个用二进制来判断 第几次方是否存在。

如 一次方  0000000....001  最低为一,说明 一次方存在

如果是 三的四次方 就是 00000000...100,开始循环a一直在加,到100时 加到结果上

b>>=1 是当前位处理过,就去掉该位

原文地址:https://www.cnblogs.com/gufana/p/10472269.html

时间: 2024-08-29 22:19:39

位运算 - 六十四位整数乘法的相关文章

六十四位整数乘法

c艹下的 long long 乘法, 用到的算法是龟速乘法 #include<bits/stdc++.h> using namespace std; long long slowmul(long long a, long long b, long long p) { long long res = 0; for(; b; b>>=1, a=(a+a)%p) if(b&1) res = (res + a) % p; return res % p; } int main() {

C之位运算(十五)

我们在嵌入式的开发中难免会遇到 C 语言中的位运算符,因为我们需要效率,而位运算恰好效率比别的运算符效率高多了.位运算符直接对 bit 为进行操作,其效率最高.常见的位运算操作如下 我们在左移和右移时必须要注意:1.左操作数必须为整数类型,char 和 short 被隐式转换为 int 后进行移位操作:2.右操作数的范围必须为:[0,31]:3.左移运算符 << 将运算数的二进制位左移,规则是高位丢弃低位补0:4.右移运算符 >> 把运算数的二进制位右移,规则是高位补符号位低位丢弃

&quot;Coding Interview Guide&quot; -- 只用位运算不用算术运算实现整数的加减乘除运算

[题目] 给定两个32位整数a和b,可正.可负.可0,不能使用算术运算符,分别实现a和b的加减乘除运算 [要求] 如果给定的a和b执行加减乘除的某些结果本来就会导致数据的溢出,那么你实现的函数不必对那些结果负责 加法运算:a + b = (a ^ b) + ((a & b) << 1) 1 public int add(int a, int b) 2 { 3 int sum = a; 4 while(b != 0) 5 { 6 sum = a ^ b; // 不带进位的加法 7 b =

java位运算

Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << 左移位,在低位处补0 >> 右移位,若为正数则高位补0,若为负数则高位补1 >>> 无符号右移位,无论正负都在高位补0 & 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. | 或(OR),对两个整型操作数中对应位执行布尔代数,两个位

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

[C++基础]位运算 游戏开发中的应用

位运算的定义:通俗点说,位运算就是对一个整数在计算机中二进制进行操作. 任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度 位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示. 位运算在游戏中的应用 往往,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这个整数的值是多少. 比如:00100010,这个8位的整数从右到左,它的第一位为0,第二位为1,第三位为0,第六

位运算总结(百科)

位运算 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算就是直接对整数在内存中的二进制位进行操作. 位运算 - 定义 在很多系统程序中常要求在位(bit)一级进行运算或处理.C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序. 运用位运算解题: Description: 第一行输入数字n(n<=50),表示有n组测试用例,第2到第n+1行每行输入数m(m为整数),统计并输出m用二进制表示时,1的个数. 例如:m=9时,二进制表示为1001,则输出2. #inc

位运算 游戏开发中的应用

位运算的定义: 通俗点说,位运算就是对一个整数在计算机中二进制进行操作. 位运算的原理是很简单的,百度百科里就能找到它的一些基本的用法,以及相关的运算符号. 大部分刚刚进入到游戏行业里的程序员,你问他什么叫位运算,他都懂,但实际中往往却不记得去使用它. 任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示. 位运算在游戏中的应用 往往,在游戏开发中做

位运算及其应用实例(1)

摘要 位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算.本篇先简要介绍基本的位运算操作符及其用法(何时使用),然后介绍位运算符的几个典型应用: (1)      三种不用临时变量交换两个整数的实例,并分析每个实例的优缺点 (2)      进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用的,用于将十进制按照2的n次方进制输出的程序. (3)      给出利用位运算实现的计算整数的二进制表示中有多少个1