1.2 位运算的定义 位运算是对整数在二进制位层面进行操作的运算,主要包括以下基本操作: 按位与(&) 规则:两个二进制位都为 1 时,结果为 1;否则为 0。...(int x, int y) { // 按位异或操作,得到二进制中 x 和 y 不同的位 // 异或规则:相同位结果为 0,不同位结果为 1 int...最终返回汉明距离:2 输出 2 4.3 时间复杂度和空间复杂度 时间复杂度 异或操作:按位异或操作的时间复杂度为 O(1)。...原因: 相同的数字异或为 0(a ^ a = 0)。 0 与任何数异或不改变数值(a ^ 0 = a)。 因此,数组中成对的数字会相互抵消,只剩下两个不同的数字的异或结果。...总结要点 异或运算 是位运算解决重复出现问题的核心思想: 相同为0,0与任何数异或等于数本身。 位统计 + 取模:通过逐位统计 1 的个数,可以解决 K次出现问题。
反码 表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码 表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加 1 。...补码详细介绍 补码是为了表示一个负数的二进制形式。 其转化方式是,先将负数当成正数,转化成二进制的形式,再将二进制正数的各个位上取反,再加上一。...,转换算为二进制后,进行与(&)运算。...还是5 | -5 0000 0000 0101 1111 1111 1011 可以看到每一位中其中一个都有1 答案 :1111 1111 1111 按位异或(^) 运算的两个数,转换成二进制数后...,进行异或(^)运算 如果相应位置上的数相同,该位取0,如果不同改位取1。
& 与运算 在二进制格式下,将两个数的每一位(1或0)分别做与运算(1&1=1,其它=0),得到一个新的二进制数。...| 或运算 在二进制格式下,将两个数的每一位(1或0)分别做或运算(0|0=0,其它=1),得到一个新的二进制数。...^ 异或运算 异或:相同为false,不同true 在二进制格式下,将两个数的每一位(1或0)分别做异或运算(0^0=0,1^1=0, 其它=1),得到一个新的二进制数。...: x = 4 y = 2 */ ~ 非运算 在二进制格式下,将两个数的每一位(1或0)分别做非运算(~0=1,~1=0),得到一个新的二进制数。...这次简单介绍了与、或、非、异或,下次再讲讲移位操作的实践。
因此,3 和 5 的不同比特位个数为 2。 二、核心思路:巧用异或运算与 “消 1” 技巧 要计算不同比特位个数,关键在于两步:第一步找出所有不同的位,第二步统计这些不同位的数量。...而 C 语言中的位运算,恰好能高效实现这两个步骤。 1. 用异或运算标记不同位 异或运算(^)的规则是:相同为 0,不同为 1。...也就是说,当我们对两个整数 m 和 n 进行异或运算后,得到的结果 i(i = m ^ n)中,所有值为 1 的位,都对应着 m 和 n 中不同的位;值为 0 的位,则对应着 m 和 n 中相同的位。...用 “i & (i - 1)” 统计 1 的个数 得到异或结果 i 后,问题就转化为 “统计 i 的二进制表示中 1 的个数”。...代码测试 我们可以通过几个测试用例,验证代码的正确性: 测试用例 1:输入 3 5,输出 2(符合预期); 测试用例 2:输入 0 0,输出 0(两个数完全相同,不同比特位个数为 0); 测试用例 3:
以下是最终整合后的目录,列出的全部内容都应该进行掌握: 位运算基础 位运算的奇淫技巧 两数之和 二的幂 一的个数 只出现一次的数字Ⅰ 只出现一次的数字Ⅱ 01 PART 位运算基础 程序中的所有数在计算机内存中都是以二进制的形式储存的...(早些年喜欢问到,现在如果谁再问,大家会觉得很low) 3、两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身。(对于找数这块,异或往往有一些别样的用处。)...在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。...首先最容易想到的方法是:我们直接把目标数转化成二进制数,然后遍历每一位看看是不是1,如果是1就记录下来。通过这种比较暴力的方式,来进行求解。...所以我们还是得使用位运算。对于“每个其余元素,均出现了二次”之所以可以使用“异或”进行求解,原因是因为“异或”操作可以让两数相同归 0。
位运算概述 在计算机中我们知道数据在内存中都是以二进制的形式储存的,位运算是直接对整形的二进制进行的操作,这样可以可以使程序的效率更高,性能更好。...因为整形的负数的二进制数是对正数的二进制数取反加一(先取反,所有的位数都不相同,+1后会发生进位,然后负数最右侧的1的左侧与正数相反,右侧与正数相同,都是0),然后&就会得到最右侧的1;可以画图试试。...示例 1: 输入:a = 1, b = 2 输出:3 示例 2: 输入:a = 2, b = 3 输出:5 算法思路 多次使用异或和按位与,我们异或两个数可以发现可以起到类似相加的效果,但是不会进位,因此...,我们需要异或后然后异或加上进位,那么进位怎么来呢,1和1才产生进位,因此我们把两个数a,b按位与,就得到了进位的二进制,还需要将1左移,因为要进到前面的高位,然后异或上刚才无进位相加的结果,循环此操作...示例 1: 输入: [1] 输出: [2,3] 示例 2: 输入: [2,3] 输出: [1,4] 算法思想 首先,将所有的数和数组中的数全部异或,结果就是缺失的两个数的异或sum,我们接下来要做的就是分开他俩
题目描述 异或运算是常见的二进制运算,给出两个n位二进制数a,b。a异或b的运算依次考虑二进制的每一位,若这一位相同,那么这一位的异或结果就是0,不同就是1。 例如a=1100, b=0100。...执行a异或b的运算,a的最高位是1,b的最高位是0,两个数字不同所以最高位异或结果是1;a和b次高位都是1,所以次高位异或为0;最后两位它们都是0,所以异或结果也都是0。...那么a异或b的答案就是1000。 现在输入两个n位二进制数,输出它们异或结果的十进制答案。上述样例中异或的二进制结果为1000,转化成十进制就是8。...输入 输入有三行,第一行一个数n(1位二进制数。输入的二进制数可能有前导零。...样例输入 4 1100 0100 输出 输出一个数,异或结果的十进制数值,不要输出前导零。
接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。 输出格式 对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。 每个结果占一行。...…… A_N 中选出两个进行 xor (异或)运算(一般异或运算是按位计算的),得到的结果最大是多少?...输入格式 第一行输入一个整数 N。 第二行输入 N 个整数 A_1 ~ A_N 。 输出格式 输出一个整数表示答案。...0 不用判断相等的情况 } } 异或也可以理解为不进位加法,相同的话异或值为0。...异或后最大,这需要寻找出与原数每位不同的数,为保证最大值,需要从最高位开始依次寻找,过程如下所示: 可以不用先全部插入,因为这是有顺序的,避免多次枚举 a_j 和 a_i 以及 a_i 和
解题思路 对于这道题,我们可以将输入的 n 右移 32 次,逐位进行比较;也可以使用上面提到的消除一个数二进制最低位1的操作,统计多少次操作后 n 变为 0 ,得到的次数即为位1的个数。...示例 1: 输入:2 输出:2 示例 2: 输入:x = 3, y = 1 输出:1 提示: 0 <= x, y <= 231 -1 解题思路 将输入的 x 和 y 右移,逐位比较,统计对应二进制位不同的位置的数目...原理:异或运算,相同为 0 ,不同为 1 。...对不缺失数字的序列 [0, n] ,将其全部数异或起来,得到一个异或值,再用这个异或值与缺失数字的数组 nums 的每个元素异或,最后的得到的结果就是缺失的数字,因为重复的数字已经被消除掉了 (...异或结果二进制表示位为 1 表示缺失的两个数字 a 和 b 该比特位的不同,找出异或值二进制表示最低位的 1 是第 i 位。
在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。...在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。...示例 1: 输入:n = 11 (控制台输入 00000000000000000000000000001011) 输出:3 解释:输入的二进制串 00000000000000000000000000001011..., python中的位运算: 位运算符 含义 计算法则 & 按位与 同1为1,其他为0 | 按位或 同0为0,其他为1 ^ 按位异或 同为0,异为1 ~ 按位取反 取反 << 左位移运算符 >> 右位移运算符...python代码3——逐位判断 当n大于0时,判断n最右一位是否为1,根据结果计数。并将n右移一位。
二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量就称为逻辑变量。...程序中的所有数在计算机内存中都是以二进制的形式储存的。...异或0具有保持的特点,而异或1具有翻转的特点 作用: 1.使特定位翻转,找一个数,对应X要翻转的各位,该数的对应位为1,其余位为0,此数与X对应位 异或即可。 ...反码: 1.正数的反码与其原码相同; 2.负数的反码是对其原码逐位取反,但符号位除外。 ...-1 = 反码 1000 0000 0000 0000 0000 0000 0000 0101 ④原码=反码 逐位取反 符号位不变 结果:-5 位异或^(真真为假 真假为真 假假为假)
按位异或(^): 运算规则:两个相应的二进制位不同时结果为1,相同时结果为0。...示例:9 ^ 5 的结果为 12,因为 9 的二进制是 1001,5 的二进制是 0101,按位异或后得到 1100,即十进制的 12。...示例:20 >> 2 的结果为 5,因为 20 的二进制是 10100,右移2位后得到 101,即十进制的 5。 代码案例 1. 按位与(AND)& 对两个数的二进制表示进行逐位与操作。...按位或(OR)| 对两个数的二进制表示进行逐位或操作。只要两个相应的二进制位中有一个为1,结果位就为1。...按位异或(XOR)^ 对两个数的二进制表示进行逐位异或操作。当两个相应的二进制位相异时,结果位为1。
位与(&)、位或(|)、位异或(^)、非位(~) 左移(>)、无符号右移(>>>) &(位与) “&”运算符(位与)用于对两个二进制操作数,逐位取与 第一个数的位值 第二个数的位值 运算结果...1 1 1 1 0 0 0 1 0 0 0 0 |(位或) “|”运算符(位或)用于对两个二进制操作数,逐位取或 第一个数的位值 第二个数的位值 运算结果 1 1 1 1 0 1 0 1 1 0 0...0 ^(位异或) “^”运算符(位异或)用于对两个二进制操作数,逐位取异或 位数据相同得 0,不同得 false 两个相同的数取异或的 0 第一个数的位值 第二个数的位值 运算结果 1 1 0 1...0 1 0 1 1 0 0 0 ~(位非) “~”运算符(位非)用于对一个二进制操作数,逐位取非 第 1 步:把运算数转换为 32 位的二进制整数。...它把无符号的 32 位整数所有数位整体右移 对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的 对于负数来说,无符号右移将使用 0 来填充所有的空位,同时会把负数作为正数来处理 console.log
进制的介绍与书写格式 进制的介绍与书写格式 代码 : public class Demo1 { /* 十进制:Java中,数值默认都是10进制,不需要加任何修饰。...0000111 反码 : 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。...: 遇true则true, 遇1则1 ^ 位异或 : 相同为false, 不同为true ~ 取反 : 全部取反, 0变1, 1变0 (也包括符号位...-位移运算符 位运算概述 : 位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算。...在二进制位运算中,1表示true,0表示false。
在离散数学中,常常会使用“与”、“或”、“非”等联结词,在集合里,也有“交”、“并”、“补”,同样的在C语言中,也有一些关系逻辑运算符号,例如:“&&”、“||”、“!”。...2020,将会输出以下结果: 2020是闰年 位运算符 位运算符作用于位,并逐位执行操作。...,带符号的二进制数) ~B = 1111 0000 (2 的补码形式,带符号的二进制数) 温馨提示:“^”是异或运算符,如果a、b两个值不相同,则异或结果为1。...如果a、b两个值相同,异或结果为0。...运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; A | B将得到47即0010 1111 ^ 异或运算符,按二进制位进行“异或”运算。
逐位检查每一位是否为 1: 因为整数在计算机中通常表示为 32 位(对于 32 位系统),我们可以通过逐位检查的方式来统计 1 的个数。...: 当两个二进制位相同(都是 0 或都是 1)时,异或结果为 0。...找到两个数字的不同位: 得到了两个数字 a 和 b 的异或结果后,a ^ b 的二进制中至少有一位为 1,表示 a 和 b 在该位上不同。...通过理解异或运算的特性,我们可以高效地解决这类问题。 相关异或运算的特性: 相同的数异或为 0:a ^ a = 0。 任意数与 0 异或结果为该数本身:a ^ 0 = a。...通过这些题目可以看到,异或操作 在处理查找、去重和加法等问题时非常高效,尤其适合那些与数字位操作相关的场景。
引言在C++编程中,位运算是一种直接对二进制位进行操作的运算方式。它不仅可以提高程序的运行效率,还能解决一些特定的算法问题,如“只出现一次的数字”系列题目。...一、位运算符概述C++ 提供了六种位运算符,分别是按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(>)。下面将分别介绍这些运算符的使用和规则。1....按位异或(^)规则:对两个操作数的对应二进制位进行异或运算,当两个对应位不同时,结果位为 1,相同时结果位为 0。...按位异或运算时,逐位比较,不同位为 1,相同位为 0,所以结果的二进制表示为 0110,十进制为 6。4. 按位取反(~)规则:对操作数的每一个二进制位进行取反操作,即 1 变为 0,0 变为 1。...找出只出现一次的数字在“只出现一次的数字”系列题目中,利用按位异或运算的特性可以高效地找出只出现一次的数字。
2、位逻辑运算符如下表: 运算符 功能 运算过程 & AND(与) 逐位与 | OR(或) 逐位或 ^ XOR(异或) 逐位异或 ~ NOR(非) 逐位非 案例程序如下: #include的补码(complement),在二进制中也就是0与1互换。...例如a=12的二进制表示法为1100,取1的补码后,由于所有位都会进行0与1的互换,因此运算后的结果为-13,运算过程如下: NOT(~) 3、位位移运算符 位位移运算符会将整数数值的各个位向左或向右移动指定的位数...语法格式如下: a<<n 举例:表达式“12的二进制值为1100,向左移动两位后成为110000(十进制为48)。...注意右边空出的位,如果数值是正数就补0,是负数则补1.语法格式如下: a>>n 例如:表达式 “12的二进制值为1100,向右移动两位后成为0011(十进制为3)。
逻辑位运算符 位运算就是对二进制数执行计算,是整数的逐位运算。 图片.png & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。...| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1。 ^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1。...位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。...在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。...它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。
答案很简单,两个相同的数进行异或之后,结果为 0,而任何一个数与 0 异或结果等于他本身。 得出这两个数的异或结果之后又什么用呢?...因此,我们可以找出第一位为 1 的位数,然后根据这一位是否为 1,将数组分为两组,分别进行异或,异或结束后即为我们所求的结果。...将这个数组与 0-1000 这 n 个连续自然数进行异或,得到这两个去掉的数的异或值 再找出这个异或值第 1 位为 1 的位数,标记为 N 在遍历这个数组,根据第 N 位是否为 1,分为两组进行异或 这种解法需要遍历数组两次...现在增加了single number,那么对这32位中的每一位做相同的处理,也就是说,逐位把所有的输入加起来,并且看看第i位的和除以3的余数,这个余数就是single numer在第i位的取值。...这样就得到了single number在第i位的取值。这等价于一个模拟的二进制,接着只需要把这个模拟的二进制转化为十进制输出即可。