位运算

腾讯面试题:位运算——用位存储40亿个40亿以内的整数

ε祈祈猫儿з 提交于 2020-02-02 00:54:31
一、题目 1: #include <iostream> 2: using namespace std; 3: 4: typedef unsigned int Bit32; // 能表示42亿+的无符号整数 5: 6: const Bit32 maxLen=125000001; //数组长度,0-40亿 7: const Bit32 thirtytwo=32; 8: 9: void createArray(Bit32 *&arr) 10: { 11: arr=new Bit32[maxLen]; 12: memset(arr,(Bit32)0,sizeof(arr)); 13: } 14: 15: bool setBit(Bit32 *arr,Bit32 num) 16: { 17: if(((arr[num/thirtytwo])&(1<<(thirtytwo-num%thirtytwo-1)))==0) 18: { 19: arr[num/thirtytwo]|=1<<(thirtytwo-num%thirtytwo-1); 20: return true; 21: } 22: else 23: { 24: return false; 25: } 26: } 27: 28: int main() 29: { 30: Bit32 *s; 31: createArray(s); 32

[专题六] 位运算

旧时模样 提交于 2020-02-01 12:51:32
位运算 位运算的基本操作 typedef struct Bitset { int setsize; // 16 32 ... int 是32位的 int arraysize; // 相当于有几行 unsigned short *v; // 之后会分配一片连续的空间 }Bitset; //还非要大写才行 .. // SetInit(size) 集合大小 Bitset SetInit(int size) { Bitset s; s.setsize = size; s.arraysize = (size + 15) >> 4; // 右移4位 除以16 //我之前好像智障了 sizeof后面的是不需要看的 肯定是要带上的 所以这行就是相当于 创建一个sizes长度的v 类型是unsigned short型 s.v = (unsigned short*) malloc( size * sizeof(unsigned short)); for (int i = 0; i < size; i++) { s.v[i] = 0; // 初始化 } return s; } // SetAssign(A, B) 将集合B 复制 到集合A void SetAssign(Bitset A, Bitset B) { if(A.setsize!=B.setsize) exit(-1); for(int i =

位运算

不想你离开。 提交于 2020-01-31 20:53:33
位运算 1. 求a的b次方对p取模的值 快速幂模板 typedef long long ll; long long power(ll a,ll b,ll p) { int ans=1%p; while(b) { if(b&1) ans=ans*a%p; a=a*a%p; b>>=1; } return ans; } 2. 64位整数乘法 求a乘b对p取模 ll power(ll a,ll b,ll p) { ll ans=0%p; while(b) { if(b&1) ans=(ans+a)%p; a=a*2%p; b>>=1; } return ans; } 来源: https://www.cnblogs.com/arbor-one/p/12246576.html

C#位运算讲解与示例

匆匆过客 提交于 2020-01-31 09:18:23
今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与。 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { .... } 如去掉 删除权限: purview=purview&(uint.MaxValue - (uint)k2) 说到这里肯定会有疑问了,别急我来细细讲解。 第一,2的8位二进制值为00000010 4的8位二进制值为00000100 8的8位二进制值为00001000 第二,当对8和4进行按位或操作后,结果为: 4|8 = 12 00000100 |00001000 = 00001100 为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001 ;00000001|00000000=1 ;00000000|00000000=00000000 也就是说除了0|0结果是0外,其它运算结果的都是1 所以 00000100 |00001000 = 00001100 也就说上面的

C#位运算讲解与示例

不羁岁月 提交于 2020-01-31 08:28:15
文章转载自http://www.cnblogs.com/zgqys1980/archive/2010/05/31/1748404.html 今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与。 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { .... } 说到这里肯定会有疑问了,别急我来细细讲解。 第一,2的8位二进制值为00000010 4的8位二进制值为00000100 8的8位二进制值为00001000 第二,当对8和4进行按位或操作后,结果为: 4|8 = 12 00000100 |00001000 = 00001100 为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001 ;00000001|00000000=1 ;00000000|00000000=00000000 也就是说除了0|0结果是0外,其它运算结果的都是1 所以 00000100 |00001000

C#位运算讲解与示例

社会主义新天地 提交于 2020-01-31 07:51:21
今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与。 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { .... } 说到这里肯定会有疑问了,别急我来细细讲解。 第一,2的8位二进制值为00000010 4的8位二进制值为00000100 8的8位二进制值为00001000 第二,当对8和4进行按位或操作后,结果为: 4|8 = 12 00000100 |00001000 = 00001100 为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001 ;00000001|00000000=1 ;00000000|00000000=00000000 也就是说除了0|0结果是0外,其它运算结果的都是1 所以 00000100 |00001000 = 00001100 也就说上面的 purview = k2|k3 的二进制值结果是 purview =00000100 |00001000

C#位运算讲解与示例

陌路散爱 提交于 2020-01-31 07:19:36
首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与。 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { .... } 说到这里肯定会有疑问了,别急我来细细讲解。 第一,2的8位二进制值为00000010 4的8位二进制值为00000100 8的8位二进制值为00001000 第二,当对8和4进行按位或操作后,结果为: 4|8 = 12 00000100 |00001000 = 00001100 为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001 ;00000001|00000000=1 ;00000000|00000000=00000000 也就是说除了0|0结果是0外,其它运算结果的都是1 所以 00000100 |00001000 = 00001100 也就说上面的 purview = k2|k3 的二进制值结果是 purview =00000100 |00001000 =00001100了 第三

C#位运算 示例

你说的曾经没有我的故事 提交于 2020-01-31 06:04:52
在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。 C#支持的位逻辑运算符如表2.9所示。 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑非运算 整型,字符型 整型 1 ~a & 位逻辑与运算 2 a & b | 位逻辑或运算 2 a | b ^ 位逻辑异或运算 2 a ^ b >> 位右移运算 2 a>>2 1、位逻辑非运算 位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。 比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是: ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。 2、位逻辑与运算 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 比如:10010001(二进制)&11110000等于10010000(二进制)。 3、位逻辑或运算 位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1, 0或0等于0。比如10010001(二进制)| 11110000(二进制

C# 中的位运算

ε祈祈猫儿з 提交于 2020-01-31 05:54:15
在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如表2.9所示。 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑 非 运算 整型,字符型 整型 1 ~a & 位逻辑 与 运算 2 a & b | 位逻辑 或 运算 2 a | b ^ 位逻辑 异或 运算 2 a ^ b << 位 左移 运算 2 a<<4 >> 位 右移 运算 2 a>>2 1、 位逻辑非运算 位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。 比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是: ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。 2 、位逻辑与运算 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 比如:10010001(二进制)&11110000等于10010000(二进制)。 3、 位逻辑或运算 位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1, 0或0等于0

自用笔记18——位运算

懵懂的女人 提交于 2020-01-31 05:47:06
int getSum ( int a , int b ) { if ( b == 0 ) return a ; int sum = a ^ b ; unsigned int carry = ( unsigned int ) ( a & b ) << 1 ; return getSum ( sum , carry ) ; } 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = 3 输出: 1 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sum-of-two-integers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 如果不用“+”和“-”,可以用 位运算 代替:①计算无进位的加法;②记下各位的进位;③将前两步结果相加。 如:11+26 二进制为1011+11010.①无进位的加法:10001,此时结果为17.②计算进位:10100.③相加:100101,结果为37,完美。 显然第一步无进位加法中,1+0=1,0+0=0,0+1=1,1+1=0,可以用异或来计算; 第二步计算进位中,只有当位置上为两个1相加时,才向下一位进一