位运算

位运算

烈酒焚心 提交于 2019-12-07 19:01:27
背景: ​ 上课进度:Part1_递归及位运算 偶数判断 x&1 TRUE return 0; FALSE return 1; 2^n判断 x&(x-1) TRUE return 0; FALSE return 1; 来源: https://www.cnblogs.com/FirwoodLin/p/12002957.html

第【1】章: 位运算的奇巧 学习报告

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 10:52:30
(1.1 )节: 课程介绍 略 (1.2 )节: 如何找出数组中唯一成对的那个数 1.题干: 2.解答思路:异或可以使相同项两两消除1^1=0,即把全部数用^连接,然后与1到1000^的结果再进行^。因为1-1000除了那个重复的出现3次,其他都出现两次,可以消除 3.关键代码: int d=0; for(int i=1;i<=1000;i++) d=d^i; //1-1000的异或结果 for(int i=0;i<=1000;i++) d=d^a[i]; //1-1001的结果与d进行异或 cout<<d<<endl; (1.3 )节: 找出落单的数 1.题干: 2.解答思路:将所有数和^运算符连接,结果就是落单的数 3.关键代码: int b=0; for(int i =0;i<n;i++) b=b^a[i]; cout<<b; (1.4 )节: 一题三解:二进制中1 的个数 1.题干: 2.解答思路: 方法一:利用1&1=1;1&0=0;将1不断<<右移与输入的值比较,进行计数; 方法二:利用1&1=1;1&0=0;将输入的值不断>>左移和1进行比较,进行计数; 方法三:采用削1法,将N-1后再与N做&运算,可消掉原N中一位1 3.关键代码: 方法一: Int dd (int a) { int b=0; for(int i=0;i<32;i++) //整形int为32位 If

leetcode top100 刷题(位运算)

末鹿安然 提交于 2019-12-06 07:22:05
目录 leetcode top100 刷题(位运算) 78. 子集 136. 只出现一次的数字 169. 多数元素 338. 比特位运算 461.汉明距离 leetcode top100 刷题(位运算) 78. 子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []] 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/subsets 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 这个就是代数里面的幂集,首先考虑代数的方法。对于一个有 \(n\) 个数的列表,其幂集大小为 \(2^n\) 。我们可以采取这样的思路,即首先将这 \(2^n\) 个数字在列表中呈现出来,然后再将每个数字按照2进制位数为0或者1映射到子集中去,然后再将子集添加到幂集中。具体考虑映射的时候,我们先将每个数字转化为2进制,随后将二进制数字转化为字符列表,然后反转来补全‘1’,再然后继续再翻转(其实可以去掉这个翻转,不影响结果,纯粹为了数学上好看),然后将原集合映射到子集中去。 class Solution: def

位运算

浪尽此生 提交于 2019-12-06 02:32:54
二进制 0 + 1 = 1 1 + 1 = 10 10 + 1 = 11 11 + 1 = 110 如何求一个数的2进制? 把这个数对2求余,得到的数字反过来 正数二进制变负数二进制 m << n m乘以2的n次方 (左移后最高位补0) m >> n m乘以2的负n次方 (乘以一个数的负n次方, 等于除以这个数的n次方) (右移后最高位为1时补1, 最高位为0时补0) m >>> n m 乘以2的负n次方 (区别是无符号右移最高位都补0) m & n 都为1时为1,负责为0 m | n 都为0时为0,负责为1 m ^ n 相同为0,不同为1 ~n 反码 1为0,0为1 来源: https://www.cnblogs.com/btxd/p/11957210.html

vijos1026 BFS与位运算

◇◆丶佛笑我妖孽 提交于 2019-12-05 20:57:30
题目描述 羽毛笔和im是抽签到同一个考场的,她们突然闻到一阵刺鼻的化学试剂的气味。 机灵鼠:(头都不抬)你们是考生么?还在门口磨蹭什么?快进来帮我忙!!……怎么还不进来?你们拖赛,拖赛,把你们的青春都拖掉赛…… im:开…开策了>_< 羽毛笔:哎呀~~机灵鼠大人要我们帮什么忙?^^ 机灵鼠:你们看这里的这些药,都是我研制的对付各种症状的解药。可是我一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症……(im:那…那是解药还是毒药啊?!)……经过我天才的努力(背景:我是天才!!),终于弄清了每种药的具体性能(路人甲:那是你自己配的吗?-_-),我会把每种药能治的病症和能使人患上的病症列一张清单给你们,然后你们要根据这张清单找出能治愈所有病症的最少药剂组合……顺便说一声,病症的数目不超过10种(小呆:偶是好人吧^^),我的药是用不完的,就是说每种药剂都可以被重复使用。给你们的单子里第一行是病症的总数n,第二行是药剂的种类m(0<m<=100),以下有m行,每行有n个数字用空格隔开,文件的第i+2行的n个数字中,如果第j个数为1,就表示第i种药可以治愈病症j(如果患有这种病的话则治愈,没有这种病则无影响),如果为0表示无影响,如果为-1表示反而能使人得上这种病(无病患上,有病无影响)。我制的药任何两种性能都不同

反码、原码、补码及位运算

家住魔仙堡 提交于 2019-12-05 14:00:13
JAVA的基本数据类型及其取值范围 类型 存储需求 bit 数 取值范围 备注 int 4字节 4*8 -2147483648~2147483647 即 (-2)的31次方 ~ (2的31次方) - 1 short 2字节 2*8 -32768~32767 即 (-2)的15次方 ~ (2的15次方) - 1 long 8字节 8*8 即 (-2)的63次方 ~ (2的63次方) - 1 byte 1字节 1*8 -128~127 即 (-2)的7次方 ~ (2的7次方) - 1 float 4字节 4*8 float 类型的数值有一个后缀 F(例如:3.14F) double 8字节 8*8 没有后缀 F 的浮点数值(例如:3.14)默认为 double boolean 1字节 1*8 true、false char 2字节 2*8 Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。 反码、原码、补码 在计算机系统中,数字一律用补码来表示、运算和存储。 原码 :最高位为符号位的二进制数。 反码 :正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。 补码 :正数的补码是其本身,负数的补码在其原码的基础上,符号位不变,其余各位取反,最后+1。 由来 : 本来的二进制数是没有正负的,为了区分正负数,将二进制的最高位用来表示正负(0表示正

golang位运算

你说的曾经没有我的故事 提交于 2019-12-04 23:46:12
目录 &(AND) |(OR) ^(XOR) &^(AND NOT) << 和 >> & 位运算 AND | 位运算 OR ^ 位运算 XOR &^ 位运算 (AND NOT) << 左移 >> 右移 &(AND) & 运算:相同位的两个数字都为1,则为1;若有一个不为1,则为0。 0000 0100 4 0000 0110 6 --------- 0000 0100 4 |(OR) | 运算:相同位只要一个为1即为1。 0000 0100 4 0000 0110 6 --------- 0000 0110 6 ^(XOR) 作为二元运算:相同位不同则为1,相同则为0。 0000 0100 4 0000 0110 6 --------- 0000 0010 2 作为一元运算:按位取反。 涉及知识点,参考: 博文 所有正整数的按位取反是其本身+1的负数 所有负整数的按位取反是其本身+1的绝对值 零的按位取反是 -1 0000 0100 4 原码 0000 0100 4 补码 1111 1011 4的补码取反记为 x 1111 1010 x-1 得到反码记为 y 1111 0101 y 取反得到源码,此为最终结果 -5 &^(AND NOT) &^ 运算:位清空运算,和被运算变量位置有关系。计算x&^y 如果ybit位上的数是0则取x上对应位置的值,

数据结构与算法(位运算)

有些话、适合烂在心里 提交于 2019-12-04 20:43:18
位运算 内存中的数据,最终的存储方式都是二进制,位运算就是对整数在内存的二进制位进行操作。 按位与 & 两个整数进行按位与运算,相同二进制位的数字如果都是是,则结果为1,有一个为0,则结果为0 下面是 3 & 7 的计算过程 二进制 整数 0 1 1 3 1 1 1 7 0 1 1 3(结果) 3 & 7 = 3 按位或 | 两个整数进行按位或运算,相同二进制位的数字如果有一个为1,则结果为1,都为0,则结果为0 下面是 5 | 8 的计算过程 二进制 整数 0 1 0 1 5 1 0 0 0 8 1 1 0 1 13(结果) 5 | 8 = 13 左移 << 二进制向左移动n位,在后面添加n个0 下面的 3 << 1 的计算过程 二进制 整数 1 1 3 1 1 0 6 3<<1 = 6 练习:一组数,内容为 3,9,19,20 ,请用一个整数来表示这四个数 var value = 0 value = value | 1<<3 value = value | 1<<9 value = value | 1<<19 value = value | 1<<20 console.log(value) 程序输出结果为:1573384 bitmap 新的实现方式 经过前面一系列的分析和位运算学习,现在我们要重新设计一个类,实现 addMember 和 isExist 方法,用更快的速度

原码、反码、补码和位运算

江枫思渺然 提交于 2019-12-04 20:12:59
参考: https://www.zhihu.com/question/20159860 https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 总结一些要点 为了使计算机运算数据更加简单,减法转换为加法: 1 - 1 => 1 + (-1)。为了支持这个功能,计算机对数据的存储需要一些额外的处理。 原码:最高位作为符号位,也就是对于1和-1的区别,只是最高位不一样。 反码:正数的反码和原码是一致的,而负数,除了最高位是1,其余位取反。 补码:正数的补码和原码是一致的,而负数的补码是负数的反码+1,+1之后可能会触发进位,导致最高位由1变成0,这种情况下所有位都是0了,也就是数字的值为0,因为0没有正负之分,所以可以认为补码表示法中,计算机认为最高位是1的都是负数,其余都是正数或者0 计算机采用补码的编码方式来存储数字 ,如以4位的数字长度表示 3 + (-3): 3的补码 = 3的原码 = 0011 -3的补码 = -3的反码(1100) + 1 = 1101 0011 + 1101 = 10000,因为这里数字位为4,超出的被丢弃掉,所以运算结果是0000 = 0 根据补码的规律,计算出实际的数值,如 1010 0000 0000 0000 0000 0000 0000 0000 -1之后

Java位运算总结

对着背影说爱祢 提交于 2019-12-04 08:08:06
关于位运算,以前也见过,搜过,当时会用了,过后就忘了,今天好好学习一遍,然后整理一下。 Java中的位运算,涉及到计算机的二进制,位用bit表示,1Byte=8bit,根据各种基本数据类型占用的字节空间,可以计算各种数据有多少二进制,可以算出对应的取值范围。 java中的位运算包括:与(&)、或(|)、异或(^)和非(~);    移位运算包括:左移运算(<<)、右移运算(>>)和无符号右移运算(>>>),没有无符号左移运算。 前提:数字与数字位运算,都会先装换成二进制,下面不在重复,都默认转成二进制。 1、与(&)运算,两个数字与运算就是对比相同位的数字,都为1则为1,否则为0.   举例:3&4的值为多少? 3的二进制11,4的二进制100,没数字用0补齐,则是011对100,没有都为1的情况,则3&4的二进制结果为000,转换10 进制也为0. 2、或(|)运算,两个数字对比之后,有一个为1则为1。   举例:3|4的值为多少? 011对100,结果为111,转换为10进制为7。 3、异或(^)运算,对比之后,不同的为1,相同的为0。   举例:3^4的值为多少?011对100,结果为111,转换为10进制为7。 4、非(~)也叫取反运算,1变0,0变1。具体的变化这里设涉及到 原码反码和补码 ,我单独写个帖子。 5、左移运算符(<<),将二进制的数据向左移动对应位数