位运算

关于位运算的奇技淫巧

拟墨画扇 提交于 2019-11-27 07:36:44
最近看了一些关于位运算的题目,受益匪浅,觉得位操作符真心强大,无懈可击!特此总结一下,感谢那些公众号(苦逼的码农_帅地)与广大博主! 1. 判断奇偶性 一般操作是: 1 if( n % 2) == 1{ 2 // n 是个奇数 3 } 但是!!!运用位操作符,发现,只需要判断最后一位上是否是1就行了(想想8421码的构成),只有当最后一位是1时,那么该数就是奇数,非1(也就是0)时,是偶数。如下: 1 if(n & 1 == 1){ 2 // n 是个奇数。 3 } 虽然形式基本一样,虽然我们写成 n % 2 的形式,编译器也会自动帮我们优化成位运算,但是!!!如果是你自己写出来,你自己难道不觉得自己很牛逼吗?是不是感觉逼格一下就上去了?【特此声明:别人看不懂,挨打别怪我】除此外,时间效率也快很多。 2. 交换两个数 一般操作是,借助一个中间变量: 1 int tmp = x; 2 x = y; 3 y = tmp; 但是!!!万一哪天有人抽风了要为难你, 不允许你使用额外的辅助变量来完成交换呢? 你还别说,有人面试确实被问过,这个时候,位运算大法就来了。代码如下: 1 x = x ^ y // (1) 2 y = x ^ y // (2) 3 x = x ^ y // (3) 运用异或运算,异或运算性质是:相同位为0,不同位为1。故自己和自己异或,肯定是0啊,如:x^x=0,

异或(按位枚举位运算,十分美妙的错题,带我千百遍刷之熟练之!)

此生再无相见时 提交于 2019-11-27 05:16:00
分析: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 55; int n; int cnt[N];//统计数组 int main() { int T,x,b; scanf("%d",&T); while (T--)//样例数T { scanf("%d",&n);//每个样例有n个数 memset(cnt,0,sizeof(cnt)); //异或运算(^)对于+是满足结合律的。 a1^x+a2^x+a3^x == (a1+a2+a3)^x. //按位枚举,统计x的二进制形式中在各个数位上1的个数来嘞! for(int i=0;i<n;i++) { scanf("%d",&x);//颇有意味。 for(int i=0;i<=30;i++) { if(x&(1<<i)) cnt[i]++; } } long long ans=0; for(int i=0;i<=30;i++) {//同则泯灭为0,异则得生为1. 好巧妙地题目! ans+=1LL*min(cnt[i],n-cnt[i])*(1<<i); } printf("%lld\n", ans); } return 0; }   REF:https://blog.csdn.net/idrey

An easy problem(位运算)

ぐ巨炮叔叔 提交于 2019-11-27 05:03:05
As we known, data stored in the computers is in binary form.(数据以二进制形式存储于电脑之中。)The problem we discuss now is about the positive integers and its binary form. Given a positive integer I, you task is to find out an integer J, which is the minimum integer greater than I, and the number of '1's in whose binary form is the same as that in the binary form of I. For example, if "78" is given, we can write out its binary form, "1001110". This binary form has 4 '1's. The minimum integer, which is greater than "1001110" and also contains 4 '1's, is "1010011", i.e. "83", so you should output "83".

位运算的“奇巧淫技”

不问归期 提交于 2019-11-27 04:59:51
#include<bits/stdc++.h> using namespace std; int getbits(int n)//统计(n)bin中的1的个数 { int res=0; while(n) { res++; n=n&(n-1); } return res; } int cmp(int a,int b)//统计a,b中the number of different bits in the binary format of a and b. { return getbits(a^b); } int main() { int a,b; while(cin>>a>>b) cout<<cmp(a,b)<<endl; return 0; }    来源: https://www.cnblogs.com/dragondragon/p/11340440.html

Binary Number(位运算)

十年热恋 提交于 2019-11-27 04:59:18
#include<bits/stdc++.h> using namespace std; int n; int getBits1(int n)//求取一个数的二进制形式中1的个数. { int res=0; while(n) { if(n&1) res++; n>>=1; } return res; } int getBits2(int n) { int res=0; while(n) { res++; n=n&(n-1);//一次消去1个1哦 } return res; } int main() { while(cin>>n) { cout<<getBits1(n)<<" "<<getBits2(n)<<endl; } return 0; } // 1= 1 1 // 2= 10 1 // 3= 11 2 // 4=100 1 题目: For 2 non-negative integers x and y, f(x, y) is defined as the number of different bits in the binary format of x and y. For example, f(2, 3)=1,f(0, 3)=2, f(5, 10)=4. Now given 2 sets of non-negative integers A and B, for each

写在快速幂模板之前的位运算介绍

落花浮王杯 提交于 2019-11-27 02:45:29
先介绍一些位运算的技巧: &:  0&0==0&1==1&0==0  1&1==1 |:   0|1 ==1|0 == 1|1 ==1  0|0==0 我们程序里的所有数在内存里都是以二进制的形式存储的,位运算就是直接对这些二进制数进行运算。 1. 位与运算 & 相同位数的两个数都为1,就为1,如果有其中一个不是1,则为0。 1101 & 1100 == 1100 用任意一个数&1就可以取到末位的数字。这样一来就可以判断奇偶性。 2&1 == 10&1 == 10&01==0 2.位或运算 | 只要一个位为1,,那么就为1。 1100 | 0001 == 1101 这个操作可以保存两个数中的1。 3.位异或^ 0 xor 0 == 1 xor 1== 0,1 xor 0 == 0 xor 1==1 相同为0,不同为1。 1011^0101==1110 一个数连续异或两次相同的数就可以得到它本身。有了这个性质,就可以实现两个变量数据的交换。 #include<iostream> using namespace std; int main() { int i,j; while(cin>>i>>j) { //swap(i,j); i=i^j; j=i^j;//j <- (i^j)^j==i i=i^j;//i <- (i^j)^i==j cout<<i<<" "<<j<<endl; }

位运算

限于喜欢 提交于 2019-11-27 02:40:33
位运算 Bitwise operations 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。 常见位运算符: 编程常用的位运算操作 x & 1 == 1 or == 0 判断 x 的二进制最后是 1 还是 0,即判断奇偶性(x % 2 == 1) x = x & (x - 1) 清零最低位的 1。例如 110101 & 110100 得到110100;110100 & 110011 得到11000 x & -x 得到最低位的1。 -x 是取反再加1 x & ~x 得到 0 更为复杂的位运算操作 1. 将 x 最右边的 n 位清零:x & (~0 << n) 2. 获取 x 第 n 位值:(x >> n) & 1 3. 获取 x 第 n 位的幂值:x & (1 << (n-1)) 4. 仅将第 n 位置为 1:x | (1 << n) 5. 仅将第 n 位置为 0:x & (~(1 << n)) 6. 将 x 最高位至第 n 位(含)清零:x & ((1 << n) - 1) 7. 将第 n 位至第 0 位(含)清零:x & (~((1 << (n + 1)) - 1)) 来源: https://www.cnblogs.com/chaojunwang-ml/p/11338890.html

NumPy 位运算

房东的猫 提交于 2019-11-27 02:30:12
章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切片 NumPy 广播 NumPy 数组迭代 NumPy 位运算 NumPy 字符串函数 NumPy 数学函数 NumPy 统计函数 NumPy 排序、查找、计数 NumPy 副本和视图 NumPy 矩阵库函数 NumPy 线性代数 NumPy 位运算 NumPy包中,可用位操作函数进行位运算。 bitwise_and 位与运算 bitwise_or 位或运算 invert 位非运算 left_shift 左移位 right_shift 右移位 bitwise_and 要对数值进行位与运算,可以使用 bitwise_and() 函数。 示例 import numpy as np print ('\n13与17的二进制表示:') a,b = 13,17 print (bin(a)) print (bin(b)) print ('\n13与17相与:') c = np.bitwise_and(13, 17) print (bin(c)) 输出 13与17的二进制表示: 0b1101 0b10001 13与17相与: 0b1 bitwise_or 要对数值进行位或运算,可以使用 bitwise

基础位运算基本原理和应用

十年热恋 提交于 2019-11-26 21:08:16
微信公众号 位运算是编程语言的基础,在看源码的时候会看到很多位运算代码,但是在项目代码中很少会看到位运算。因为应用代码中,有很多判断和计算都可以直接用数值的判断和计算完成,没有必要去用位运算,以至于这些基础的东西慢慢用的越来越少,慢慢也就忘了。导致的一个结果就是看源代码很费力,因为大量的位运算逻辑,看不懂。 作为程序员感觉数据位运算是非常必要,有点如下: 看源码时能够更好的理解 位运算更接近计算机的习惯,执行的效率会更高 装逼利器,在项目中使用位运算,体现逼格 N种基本的位运算 位运算 -- 与运算符(&) 运算规则: 操作数1 0 0 1 1 操作数2 0 1 0 1 与运算 0 0 0 1 规则总结:只有两个操作数都是1的时候运算结果才为1,其他都是0。换句话说就是只要包含0就是0。 运算如下: 位运算 -- 或运算符(|) 运算规则: 操作数1 0 0 1 1 操作数2 0 1 0 1 或运算 0 1 1 1 规则总结:只有两个操作数都是0的时候运算结果才为0,其他都是1。换句话说就是只要包含1就是1。 运算如下: 位运算 -- 非运算符(~) 运算规则: 操作数 1 0 或运算 0 1 规则总结:取反操作,1变0,0变1。 位运算 -- 异或运算符(^) 运算规则: 操作数1 0 0 1 1 操作数2 0 1 0 1 或运算 0 1 1 0 规则总结:操作数相同

c#中的位运算

孤街浪徒 提交于 2019-11-26 17:19:03
&与 全为1才是1 |或 全为0才是0 !非 两边相同时为1,不同时为0 ~取反 0变1,1变0,包括符号位 >>右移 溢出舍掉,正数补0,负数补1,移动n位:原数 / 2的n次方 <<左移 右边补0,移动n位:原数 * 2的n次方 负数的二进制是补码存放(取反+1) 0000 0001 1 1111 1111 -1 来源: https://www.cnblogs.com/1016391912pm/p/11328876.html