位运算

2019E1_ A 位运算

感情迁移 提交于 2019-12-02 10:30:24
A 位运算 题目 基础的位运算和二进制相关的知识大家在程序设计课上已经学到,这学期的面向程序设计的硬件基础也会给大家更深入的讲解。这里就不再赘述,只列举一下知识点,不熟悉的同学请自行熟悉一下。 逻辑运算符, &,|,~,^,! 移位 >>,<< 各种类型变量的长度 补码反码 memset初始化值一般设置为0 or -1 or 0x3f 练习题 难度:简单 给出一个小于232 的正整数a,将其低16位和高16位交换后输出(用十进制表示的正整数)。 输入 第一行一个正整数t,表示数据组数(0<t<100) 接下来t行,每行一个正整数a(0<a<232) 输出 t行,每行一个正整数 样例输入 2 1 1314520 样例输出 65536 249036820 样例解释 1用二进制表示为0000 0000 0000 0000(高16位) 0000 0000 0000 0001(低16位) 交换后,0000 0000 0000 0001 0000 0000 0000 0000 值为65536 思路 注意数据范围。 代码 ```#include < iostream > using namespace std ; int main ( ) { int time ; cin >> time ; while ( time -- ) { unsigned n ; cin >> n ; unsigned

[CF1010D]Mars Over_位运算性质

淺唱寂寞╮ 提交于 2019-12-02 05:45:08
Mars rover 题目链接 : http://codeforces.com/problemset/problem/1010/D 数据范围 :略。 题解 : 因为每次只改一个,改完之后 改回去 ,这个性质很重要。 发现有些叶子更改了之后,整体的答案是不变的,因为会出现:他的父亲是$\&$操作但是另一个儿子是$0$这种... 故此,我们先算出一个节点都不更改时,每个节点的值。 之后我们通过位运算,对每一个节点维护一个$tag$表示这个节点更改会不会影响到根节点。 遍历即可,细节可以看代码。 代码 : #include <bits/stdc++.h> #define N 1000010 #define setIO(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) using namespace std; char s[10]; int opt[N], val[N], ch[N][2]; bool tag[N]; char *p1, *p2, buf[100000]; #define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ ) int rd() { int x = 0,

卡常小技巧(不定时更新)

我是研究僧i 提交于 2019-12-02 04:48:16
整理一些常见的和冷门的卡常技巧,欢迎大家评论补充。 1.定义常量const int 给定mod用const int,mod用的多的话时间至少减半(有一次比赛题目TLE了,考完加了const从3.1s->1.2s) 2.寄存器register的使用 一般用在循环中用register int,不要滥用,不然可能会出现玄学错误! register int 亲测在for循环中时间为直接int的1/5,减少了4/5! 3.函数化   inline int add(int a,int b) {return a+b>mod?a+b-mod:a+b;}   inline int sub(int a,int b) {return a-b>=0?a-b:a-b+mod;}   inline int mul(int a,int b) {return 1ll*a*b%mod;} 比直接(a+b)%mod,(a-b)%mod要快一点,至于mul是为了 好看 防止忘记加1ll。 inline 一般用于比较短的,使用频率高的函数,它快的原因是把函数封装起来了, 缺点是调试时不能看到内部(网上看见的,自己调试的时候似乎没什么问题). inline 是对编译器的一个建议,不是命令,所以对于实现过程复杂的函数(如递归,需要传递参数) 编译器不会采取建议,inline是无效的。 4.位运算 比如x<<=1代替x*=2啊

[算法]位运算实现加减法

寵の児 提交于 2019-12-02 03:00:53
异或可以实现不考虑进位的加法,相同为0,不同为1 0101 ^ 0001 = 0100 两个数相加不考虑进位从二进制角度上说就是相同为0,不同为1,因为二进制只有两个数1和0 1+1=0 0+1=1 与运算可以实现进位 同为1才为1 0101 & 0001 = 0001 说明最低位有进位 int add(int a, int b) { return b == 0 ? a : add(a ^ b, (a & b) << 1); } 左移一位表示 将进位加到前一位 递归表示要遍历进位的数,上面的例子只是说明了最低位有进位,但其他位没有进位,假如其他位有进位,就必须递归的加上进位的值 类似于十进制 不考虑进位8+9=7 进位 8+9=1<<1=10 8和9相加进位1,但不是个位的1 而是10 相当于左移一位 减法转换成加法 就是将负数变成它的补码 //Complement code int negative(int n) { return add(~n, 1); } int sub(int a, int b) { return add(a, negative(b)); } 来源: https://www.cnblogs.com/tailiang/p/11727678.html

计算机2进制位运算

自作多情 提交于 2019-12-02 02:24:34
按位与(&) 0101&1001 = 0001 //有一个为0则结果为0 按位或(|) 0101|1001 = 1101 //有一个为1则结果为1 按位取反(~) ~0101 = 1010 //0变1,1变0 按位异或(^) 0101^1001 = 1100 //对应bit位相同,则结果位取0,否则取1 0异或任何数=任何数 1异或任何数=任何数取反 任何数异或自己=把自己置为0 按位异或常见用途: 1.使某些特定的位翻转 (reverse) 2.实现两个值的交换,而不必使用临时变量 a=9(1001), b=12(1100) a = a^b //0101 b = b^a //1001 a = a^b //1100 3.快速判断两个值是否相等 return (a^b)== 0 原码:一个数绝对值的2进制码就是该数的原码 反码:对一个数的原码取反,得到的就是该数的反码 补码:对一个数的反码+1,得到的就是该数的补码(最小值除外) 移位运算 << 左移位 计算规则:将2进制数据整体向左移动一位,高位自动溢出,低位补0 n = 00000100 10010001 00111111 01010101 m=n<<1 0000100 10010001 00111111 010101010 k=n<<2 000100 10010001 00111111 0101010100 j=n<<8

java中位运算^,&,<<,>>,<<<,>>>

↘锁芯ラ 提交于 2019-12-02 02:17:16
转 https://www.cnblogs.com/liaopeng/p/8436155.html#4297324 1.^(亦或运算) , 针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算的结果是 :"+(2^3)); //打印的结果是: 2^3运算的结果是 :1 } 2 =======>0010 3 =======>0011 2^3就为0001,结果就是1 2.&(与运算) 针对二进制,只要有一个为0,就为0 还是上述的例子 public static void main(String[] args) { System.out.println("2&3运算的结果是 :"+(2&3)); //打印的结果是: 2&3运算的结果是 :2 } 3.<<(向左位移) 针对二进制,转换成二进制后向左移动3位,后面用0补齐 public static void main(String[] args) { System.out.println("2<<3运算的结果是 :"+(2<<3)); //打印的结果是: 2<<3运算的结果是 :16 } 4.>>(向右位移) 针对二进制,转换成二进制后向右移动3位, public static void main(String[]

Numpy | 13 位运算

懵懂的女人 提交于 2019-12-02 00:05:50
NumPy "bitwise_" 开头的函数是位运算函数。本章都是按 二进制 来操作的。 NumPy 位运算包括以下几个函数: 函数 描述 bitwise_and 对数组元素执行位与操作 bitwise_or 对数组元素执行位或操作 invert 按位取反 left_shift 向左移动二进制表示的位 right_shift 向右移动二进制表示的位 注: 也可以使用 "&"、 "~"、 "|" 和 "^" 等操作符进行计算。 bitwise_and   bitwise_and() 函数对数组中整数的二进制形式执行位与运算。 import numpy as np a, b = 13, 17 print('13 和 17 的二进制形式:',bin(a), bin(b)) print('13 和 17 的位与:',np.bitwise_and(13, 17)) 输出结果为: 13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位与: 1 以上实例可以用下表来说明: 13 1 1 0 1 17 1 0 0 0 1 and 结果 0 0 0 0 1 bitwise_or   bitwise_or()函数对数组中整数的二进制形式执行位或运算。 import numpy as np a, b = 13, 17 print('13 和 17 的二进制形式:',bin(a

位运算相关

时光总嘲笑我的痴心妄想 提交于 2019-12-01 16:10:17
目录 一、位操作 基本的位运算符 注意事项 二、二进制常规变换操作 一、位操作 基本的位运算符 名称 符号 运算规则 与 & 当且仅当两位均为1时输出1 异或 ^ 两位相同输出0,相异输出1 或 | 当且仅当两位均为0时输出0 取反 ~ 输入0输出1,输入1输出0 左移 << 各二进位左移若干位,低位补0 右移 >> 各二进位右移若干位,高位补0或符号位 注意事项 1、取反为单目运算符,表达式为 ~expr ,其余均为双目运算符,表达式为 expr1 & expr2 等。 2、位运算符优先级由大到小:取反、左移/右移、与、异或、或。除取反以外的运算符优先级低于加减运算,使用时注意有时需要加括号。 3、位操作只能用于整形数据,对其他类型进行位操作会被编译器报错。 4、对有符号整型的位移操作对于不同编译器表现不同;主要体现在右移之后补位的操作,部分编译器会在高位补0而不是符号位。(也就是算术右移和逻辑右移的差别)对于无符号整型,高位均补符号位。 5、位运算支持复合操作符,即 &= 、 ^= 、 |= 、 ~= 、 <<= 、 >>= 。 二、二进制常规变换操作 部分功能来自 Matrix67的博客 。 功能 示例 位运算 去掉最后一位 (101101->10110) x >> 1 在最后加一个0 (101101->1011010) x << 1 在最后加一个1 (101101-

[LeetCode] 231. Power of Two

那年仲夏 提交于 2019-12-01 09:22:06
题意很简单,问一个数字n是否是2的几次幂。思路是用位运算做,如果你对位运算很敏感,你会发现,所有2的某次方的数字,转化成二进制之后,都只有一个1。比如 2->0010, 4->0100, 8->1000...... 所以思路是比较n & n-1是否等于0即可。因为如果n是2的某次方,比它小1的数字里面一定是一堆1。代码如下, 1 var isPowerOfTwo = function (n) { return n > 0 && (n & (n - 1)) === 0 ; }; 来源: https://www.cnblogs.com/aaronliu1991/p/11675164.html

10/14练习日志

那年仲夏 提交于 2019-12-01 09:07:14
位运算: https://blog.csdn.net/wan_ide/article/details/81108941 POJ 1845Sumdiv: (数论快速幂+分治算法等比数列求和+质因数分解+约数和定理) https://www.cnblogs.com/shenben/p/6264322.html POJ 3263 Tallest Cow:(差分+前缀和+STLmap) https://blog.csdn.net/qq_33957603/article/details/80386112 搜索+DP: https://www.luogu.org/problem/P1021 邮票面额设计 看书:复习位运算、递归 来源: https://www.cnblogs.com/little-cute-hjr/p/11674951.html