位运算

[CSP校内集训]race(位运算?)

霸气de小男生 提交于 2019-12-03 04:23:39
题意 有 \(n\) 个人,每个人有一个能力值 \(a_i\) ( \(a\) 互不相同),有 \(2^m\) 场比赛 \([0,2^m)\) ,每场比赛一个人的 得分 为 \(a_i \xor j\) ,按照得分排序,每个人获得排名 \(^2\) 的 积分 ,求每个人的积分 \(q\% (10^9+7)\) 后的异或和, \((n\leq 200000,m\leq 30)\) 思路 考场上的解法,并非最优解法qwq 由于有取模操作,只能一个个人的处理,且可以看出是要一位位的处理问题的 假设当前处理到第i个人,设 \(k_j\) 为能力值在二进制下 更高位与i一样,第j位不同 的人数,(由这个定义可知 \(\sum{k_j}=n-1\) ,即除i外的每个人会且仅会被统计一次) 暂时不管 \(k\) 怎么求,可以发现两个数之间的大小关系仅由 从高向低第一个不同的位 (即上面 \(k\) 的定义),对于一个 \(j\) ,如果第 \(j\) 位和第 \(i\) 个人一样,那么他就比不过那 \(k_j\) 个人,即排名 \(+k_j\) ,否则排名不会增加;而第 \(j\) 位是0或1的概率相等,所以第 \(i\) 个人取或不取 \(k_j\) 的概率相同,那么第 \(i\) 个人的积分为 \(0 + k_1^2 + k_2^2 +....+k_m^2 + (k_1+k_2)^2 +

【位运算】判断一个数是否为2的n次方

匿名 (未验证) 提交于 2019-12-03 00:40:02
1 import java.util.Scanner; 2 3 /** 4 * 功能:用位运算,判断一个数是否为2的n次方。 5 * 思路:用1做移位操作,然后判断移位后的值是否与给定的数相同。 6 */ 7 public class Main3 { 8 9 public boolean isPower( int n) { 10 11 if (n < 1 ) { 12 return false ; 13 } 14 15 int m = 1 ; 16 while (m < n) { 17 m = m << 1 ; 18 } 19 20 if (m == n) { 21 return true ; 22 } 23 24 return false ; 25 } 26 27 public static void main(String[] args) { 28 29 Scanner scanner = new Scanner(System.in); 30 Main3 main3 = new Main3(); 31 32 while (scanner.hasNext()) { 33 34 int n = scanner.nextInt(); 35 System.out.println(main3.isPower(n)); 36 } 37 } 38 } 原文:https://www

位运算-快速幂

匿名 (未验证) 提交于 2019-12-03 00:27:02
#include<bits/stdc++.h> using namespace std; int a,b,p; int Pow(int x,int y){ int ans=1; while(y){ if(y&1)ans=ans*x%p; x=x*x%p; y>>=1; } return ans; } int main(){ cin>>a>>b>>p; cout<<Pow(a,b); 文章来源: 位运算-快速幂

位运算-快速乘法

匿名 (未验证) 提交于 2019-12-03 00:27:02
#include<bits/stdc++.h> using namespace std; int a,b,p; int mul(int x,int y){ int ans=0; while(y){ if(y&1)ans=(ans+x)%p; x=x*2%p; y>>=1; } return ans; } int main(){ cin>>a>>b>>p; cout<<mul(a,b); 文章来源: 位运算-快速乘法

大数相加

匿名 (未验证) 提交于 2019-12-03 00:18:01
转自:https://blog.csdn.net/insistGoGo/article/details/6581466 算法思想:大数使用字符串存储,每一个单元存储操作数的每一位,之后执行位相加。 基本思路:字符串反转、字符变数字、位运算、反序输出 C语言代码: [cpp] view plain copy #include<stdio.h> #include<string.h> void char void char char char int char char char return void char char char int int //表示进位 //初始化,对以后位运算有很大帮助! char char sizeof ( char //这里不能写成memset(sum,0,sizeof(sum));原因见注意事项1 //字符串反转且字符串变数字 int int for '0' for '0' //位运算 for '0' ; //得到末位 //得到进位 void char int int int for //找到第一个不为零的位置,方便输出 for "%c" 注意事项: 1、要注意sizeof的用法 2、memset(sum,0, Max*sizeof(char) ): 3、 在这里,对字符串进行初始化0操作很重要,它会影响到位操作和输出,要引起重视! 4、100位相加

整数逆位运算

匿名 (未验证) 提交于 2019-12-03 00:14:01
整数逆位运算 描述 对整数除符号为外的数字进行逆位操作。 例如 x = 123,返回321;x = -123,返回-321。 输入格式 输入是一个整数。 输出格式 输入输出示例 输入 输出 示例 1 123 321 示例2 100000000 1 #整数逆位运算.py a=str(input("")) b=a[::-1] #print(b) if a[0]!="-": print(int(b)) elif a[0]=="-": print("-",end="") print(int(b[:-1]))    注:题目来源python123.io,链接: https://python123.io/student/courses/1081/groups/9881/problems/programmings/1166 来源:博客园 作者: 马秀昆 链接:https://www.cnblogs.com/mxk123/p/11653031.html

js位运算-按位非

匿名 (未验证) 提交于 2019-12-03 00:02:01
正数 取得二进制表示 取反(发现符号位是1,表示负数) 符号位不变,其余位取反 取反后加一 负数 取得负数的二进制表示(即绝对值的二进制反码加一) 取反即可 来源:博客园 作者: zt123123 链接:https://www.cnblogs.com/zt123123/p/11504052.html

VIJOS-P1201 高低位交换

匿名 (未验证) 提交于 2019-12-02 23:49:02
洛谷 P1100 高低位交换 https://www.luogu.org/problemnew/show/P1100 JDOJ 1349: VIJOS-P1201 高低位交换 https://neooj.com:8082/oldoj/problem.php?id=1349 Description 给出一个小于2^32的正整数。这个数可以用一个32位的二进制数表示(不足32位用0补足)。我们称这个二进制数的前16位为“高位”,后16位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。 例如,数1314520用二进制表示为0000 0000 0001 0100 0000 1110 1101 1000(添加了11个前导0补足为32位),其中前16位为高位,即0000 0000 0001 0100;后16位为低位,即0000 1110 1101 1000。将它的高低位进行交换,我们得到了一个新的二进制数0000 1110 1101 1000 0000 0000 0001 0100。它即是十进制的249036820。 Input 一个小于2^32的正整数 Output 将新的数输出 Sample Input 1314520 Sample Output 249036820 一开始的思路: 输入十进制,开long long,转二进制。

5、位运算和循环

匿名 (未验证) 提交于 2019-12-02 23:49:02
一、上一个内容的复习     1、关系运算符、逻辑运算符(多个表达式的逻辑判断)   2、 短路的与或   3、条件运算符,用来做赋值操作   4、位运算符:对表达式以二进制位单位进行运算     十进制和二进制的转化 二、位运算符:       &按位与(先把数字计算成二进制的数,然后从右开始向做写,然后比对每一位的数值,有0就是0)     |按位或(先把数字计算成二进制的数,然后从右开始向做写,然后比对每一位的数值,有1就是1)     ^按位异或(先把数字计算成二进制的数,然后从右开始向做写,然后比对每一位的数值,相同为0,不同为1)     <<左移:(7<<3:2向左移动三位 7*(2^3))     >>右移:(7>>3:2向右移动三位 7/(2^3)) 三、一些小的知识点   1、工程-包(一般是公司域名的倒置)com.hoohui.test   2、我们现在使用的一般都是java.util包中的工具,这是java专门的工具包   3、流程控制要注意每一种情况都要考虑上,否则,程序一定会出现问题的   4、小方块变暗,则程序执行完;红色则是程序正在执行 四、流程控制    注意:       在实现功能的基础上去优化代码:两个相反的判断条件,我们可以用if-else       else:表示的是否则,不能单独出现,必须要和if配对才能出现      

位运算杂谈

匿名 (未验证) 提交于 2019-12-02 23:47:01
最近和人吹水,遇到一些比较巧妙的位运算玩法 1、如何判断一个数字是2的N次幂? 博主第一反应是可以位运算,但是如何左移和又移是个问题。(循环除以除以2,结果大于1之前一直余数为零当然可以,但是的效率啊。) 此处如果数字为n,只需要n&(n-1)=0,就可以判定此数为2的N次幂 2、如何获取一个数字最近的2的N次幂,比如7->8,9->16,19->32这种。 其实在hashmap的源码里,已经给出了答案,摘抄如下: static final int tableSizeFor ( int cap ) { int n = cap - 1 ; n |= n >>> 1 ; n |= n >>> 2 ; n |= n >>> 4 ; n |= n >>> 8 ; n |= n >>> 16 ; return ( n < 0 ) ? 1 : ( n >= MAXIMUM_CAPACITY ) ? MAXIMUM_CAPACITY : n + 1 ; } 因为int最大值是2^32-1,此处做的事情其实是先把首位的1延伸至第二位,在把前两位延伸至前四位,依此类推。 转载请标明出处: 位运算杂谈 文章来源: 位运算杂谈