文章分类 - 位运算的那些事
记录一些算是常识的小知识吧
摘要:原题在这里: 概述题意,给定一个字符串数组和一个target字符串,问能否用使用字符串数组中字符串最少次数拼接出target字符串,如果不能则-1。 analyse: 很基础的想法: 桶存遍历target,再遍历一边字符串数组,先验证是否能拼凑出同时,存入字符串数组中每一个字符串的桶存字符,以便在b
阅读全文
摘要:一个会员题: 概述:问给定字符串中是否无重复字符(如果不适用额外数据结构会加分) analyse: 1.n^2暴力,n+logn排序+遍历 2.思考过位运算,因为有异或操作,但是只适用于在偶数次中找奇数次,这里不是很符合。 3.标准解法还是位运算: 如果字符只有a-z字符26个,考虑int类型有32
阅读全文
摘要:原题在这里 概述题意:给一个区间,问区间内有多少个数字的二进制有效位数是质数。 1.因为数据合适,所以直接暴力: class Solution { public: int countPrimeSetBits(int left, int right) { /* 2,3,5,7,11,13 */ int
阅读全文
摘要:原题在这里: 概述: 给定4位和6位二进制位,分别用于表示数字[0,11],[0,59],问有n位二进制生效时候所表示的时间字符串数组。 analyse: 1.直接思路就是dfs暴力构造了,但是这就增加了本题的难度,但是我还是写出来了,问题不大。 code: class Solution { vec
阅读全文
摘要:百度词条: 计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 [1] 。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也
阅读全文
摘要:原题在这里: 概述:求区间内所有数字的与运算和 analyse: 因为数据范围是INt_MAX,所以不可能暴力,必须研究数学规律。 mine_直接说了,考虑二进制的每一位,范围为[0,left],当区间端点&y都等于y,且区间长度小于y,那么一定有y。 还有更优解法,但是暂时搁置一下。 code:
阅读全文
摘要:原题在这里: 概述: 给一个数字,问这个数字的二进制表达式是否01交替 没有算法,直接二进制处理比较就行。 class Solution { public: bool hasAlternatingBits(int n) { int x = n & 1; while (n) { if ((n & 1)
阅读全文
摘要:因为树状数组要用,所以学习到了。 因为解释的太好了,我直接copy: 这里利用的负数的存储特性,负数是以补码存储的,对于整数运算 x&(-x)有 ●当x为0时,即 0 & 0,结果为0; ●当x为奇数时,最后一个比特位为1,取反加1没有进位,故x和-x除最后一位外前面的位正好相反,按位与结果为0。结
阅读全文
摘要:1.取最低,由于已知x&(x-1)是将最后一个1变成0(前篇已经解释了),那么x-x&(x-1)即是最后一位1的数值。 2.取最高,先看代码: unsigned hight_bit(unsigned x){ //x=0010 1100 0000 0000 0000 0000 0000 0000 00
阅读全文
摘要:x&(x-1)有两种用途: 1.通过与0比较判断x是否是2的n次幂 如果是,那么x-1后最高位1会后退一位,剩余位都是1,所以x>0&&(x&(x-1))==0,即是;否则不是。 【注意要打括号,“==”优先级高于‘&’】 2.判断x二进制有多少个1 通过x=x&(x-1),每一次赋值会且只会将最低
阅读全文
摘要:#include<stdio.h> int main() { int n; while(~scanf("%d",&n)) { /* '>>x'和'<<'相当于是除以2的x次方,乘以2的x次方的另一种写法 */ printf("%d %d\n",n<<1,n>>1); printf("1<<30==%
阅读全文
摘要:#include<stdio.h> #include<cstring> int a[]={1,2,3}; int main() { for(int i=0;i<3;++i) { for(int k=0;k<3;++k) { printf("%d ^ %d == %d , 两个变量:",a[i],a[
阅读全文
摘要:#include<cstdio> int main() { int a=5,b=6; printf("原值:a=%d b=%d\n",a,b); a^=b; b^=a; a^=b; printf("第一次交换:a=%d b=%d\n",a,b); a^=b^=a^=b; printf("第二次交换:
阅读全文