2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。...func main() { i := math.MinInt64 ret := reverse(i) fmt.Println(i) fmt.Println(ret) } func reverse(x...int) int { neg := ((uint(x) >> 63) & 1) == 1 x = twoSelectOne(neg, x, -x) m := math.MinInt64 / 10...o := math.MinInt64 % 10 res := 0 for x !...= 0 { if res x%10 < o) { return 0 } res = res*10 + x%10 x /= 10 } return
你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!...经典应用场景:博客列举了位运算在一些常见问题中的应用,如判断一个数是否为2的幂、计算一个数的二进制表示中1的个数、交换两个数等。通过这些实例,展示了位运算的实际效果和灵活性。...算法的终止条件 这段代码会持续执行直到进位 b 为 0。当 b 为 0 时,表示所有的进位已经被加到结果中,运算结束,a 就是最终结果。...同样通过位运算来计算进位和和,并通过循环逐步更新直到没有进位。 2.3.4 解法 5:使用模拟加法运算(不使用位运算) 这种方法通过构造一个二进制加法的循环,模拟加法过程。...提取最低有效位(LSB) 在得到 ret = a ^ b 之后,a 和 b 必然有至少一个二进制位不同。为了进一步分离这两个数字,我们可以利用 ret 中的最低有效位(LSB)。
计算所有有趣的三元组中 s 的和对于 10^9+7 的模数 1\leq n \leq 10^5,1\leq m \leq 2\times 10^5 Solution 对于所有的环,先把所有路径的异或和建一个线性基...考虑按位拆开来做,对于线性基 P,有 S 元素,某二进制位为 w,则 P 可以表示出 2^S 个不同的数。...如果 P 中存在 w 位为 1 的数,则 2^S 个数中恰有 2^{S-1} 个数的二进制第 w 位为 1,另外一半二进制第 w 位为 0。...如果 P 中不存在 w 位为 0 的数,显然不能表示出二进制第 w 位为 1 的数,所有 2^S 个数的二进制第 w 位均为 0。 那么我们只需要统计每一位有多少种被表示出来的方式,统计答案即可。...如果不存在,那么选择两个点的二进制第 w 位必须恰有一个为 1,并且此时存在 2^S 条路径的异或和第 w 位为 1。
下面详解一下该题目的思路: 我们可以采用循环的形式,先将该数字上的二进制数一个一个剥下来,再倒序着一位一位安上去,流程大概如图: 将数字剥下来我们比较好理解,无非是剥几进制就给数字一直%几就行,比如该题剥二进制...,那我们就可以先用一个变量t来记录下每一位剥下的数字,即: t=x%2; 接下来问题是怎样将剥下来的数字安进新数字的中未被占用的首位了,显然我们现在是无法知道新输入的数的二进制最高位的权重的,虽然可以在最开始使用循环计算该数字的最高位...如果还是很难理解,那不妨先想像一个十进制数"123456"是如何通过%10取下一位,然后通过"y=y*10+t"这个公式一步一步转换到"654321"的: 可能我在这里讲的还不是非常清楚,还有疑问的朋友欢迎私信我一起交流...如:13-- > 15-- > 51-- > 41 如:10-- > 12-- > 21-- > 17 通过前面2进制的例子,这道题我们很好就理解了,无非刚才是剥二进制数,现在改成剥八进制数,再给前面所有的数乘以...在转换的时候,我们先按目标进制把每一位%下来(比如要转换成二进制就是%2),但在安放的时候统一给每一位乘以10的权重,就可以打印出一个看起来像二进制的十进制数了。
(注意,一些编辑器底层会把用%判断奇偶数的代码,自动优化成位运算) 2、不使用第三个数,交换两个数。x = x ^ y , y = x ^ y , x = x ^ y。...(早些年喜欢问到,现在如果谁再问,大家会觉得很low) 3、两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身。(对于找数这块,异或往往有一些别样的用处。)...4、x & (x - 1) ,可以将最右边的 1 设置为 0。...(这个技巧可以用来检测 2的幂,或者检测一个整数二进制中 1 的个数,又或者别人问你一个数变成另一个数其中改变了多少个bit位,统统都是它) 5、i+(~i)=-1,i 取反再与 i 相加,相当于把所有二进制位设为...(如果两个数都是正数,则二进制的第一位均为0,x^y=0;如果两个数都是负数,则二进制的第一位均为1;x^y=0 如果两个数符号相反,则二进制的第一位相反,x^y=1。
众所周知,计算机的运算使用的就是二进制,它会把十进制的数转化为二进制,然后进行二进制运算,最后再转回十进制展现给我们。...书面语言是这么讲的:移位运算为什么比乘法除法快? 从效率上看,使用移位指令有更高的效率,因为移位指令占2个机器周期,而乘除法指令占4个机器周期。从硬件上看,移位对硬件更容易实现。...可以说,if你(不是最短运行时间誓不AC || 跟普通同学代码一样就浑身难受 || 急不可耐想要了解计算机的内在)那么我想,位运算是你必须get的骚技能。...POJ 3748:位操作(名字暴露了一切) 假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(从高位到低位的顺序...~:取反,对每一位取反。~1100 = 0011.还记不记得树状数组那里说过一个数n,n+(~n)=-1?显然加完所有位全是1,补码表示中32位1代表的值就是-1.
它会返回一个新的数,只有当这两个数都是1的时候才会返回1。如下: ? 位或运算符 位或运算符(|)可以对两个比特位进行比较,然后返回一个新的数,只要两个操作位任意一个为1时,那么对应的位数就为1。...位异或运算符 位异或运算符(^)可以对两个数的比特位进行比较,它返回一个新的数,当两个操作位的对应值不相等的时候,该操作位就是1。如下: ?...将一个数左移一位相当于把这个数翻倍,将一个数右移一位相当于把这个数减半。...接下来我们来说说补码表示的优点。 比如,我如果想给一个-4加个-1,那么就只需要将这两个数的全部八个比特位(包括符号位)相加,并且将计算结果中超出的部分丢弃。如下: ?...但是它有一个问题:如果整数中二进制有较多的0,那么我们每一次都右移一位做判断就会很浪费。
常见的运算总结 五道基础位运算相关题目 位1的个数 解题思路: 理解汉明重量: 汉明重量指的是一个数的二进制表示中,1 的个数。...遍历计算所有数字的 1 的个数: 对于每个 i,我们调用前面的函数 trans2bit 来计算 i 的二进制表示中 1 的个数,并将结果存储到数组中。...当两个二进制位不同(一个是 0,另一个是 1)时,异或结果为 1。 因此,x ^ y 的结果会生成一个新数,其中的每一位反映了 x 和 y 在对应位上是否不同。 若相同,则该位为 0。...统计异或结果中 1 的数量: 我们需要统计异或结果中有多少个 1。每一个 1 都代表 x 和 y 在对应的位上不同。 可以通过 s & 1 来检查异或结果 s 的最低位是否为 1。...如果是 1,则说明当前位不同,计数器加 1。 右移逐位检查: 每次检查完一位后,将 s 右移一位,继续检查下一位,直到 s 为 0,即所有的位都已经检查完毕。
and运算 & 判断奇偶数 对于除0以外的任意数x,使用x&1==1作为逻辑判断即可 if (x&1==1) { } 判断某个二进制位是否为1 比如第7位, 0x40转到二进制是0100 0000...比如说我想获得A的第三位就把B的第三位数字设置为1,则B为0000 0000 0000 0100,设置完之后再把A、B求与, 其结果若为0,说明A的第三位为0,其结果为1,说明A的第三位为1....从可变位宽扩展的符号 通过3个操作从可变位宽扩展符号 有条件地设置或清除位而不分支 有条件地否定一个值而不分支 根据掩码合并两个值中的位 计数位设置 计数位设置,幼稚的方式 计算由查找表设置的位 数位集...(后跟) 通过浮法舍入到2的下一个最高幂 向上舍入到2的下一个最高幂 交织位(也称为计算莫顿数) 交错位的明显方式 通过表查找交织位 带64位乘法的交织位 通过二进制幻数交错位 测试单词中的字节范围(并计算出现的次数...) 确定单词是否为零字节 确定一个单词的字节数是否等于n 确定一个单词的字节数是否小于n 确定单词的字节数是否大于n 确定单词是否在m和n之间有一个字节 按词典顺序计算下一位排列 更多内容可以查看: http
判断奇偶数 对于除0以外的任意数x,使用x&1==1作为逻辑判断即可 if (x&1==1) { } 判断某个二进制位是否为1 比如第7位, 0x40转到二进制是0100 0000,代表第7...比如说我想获得A的第三位就把B的第三位数字设置为1,则B为0000 0000 0000 0100,设置完之后再把A、B求与, 其结果若为0,说明A的第三位为0,其结果为1,说明A的第三位为1....从可变位宽扩展的符号 通过3个操作从可变位宽扩展符号 有条件地设置或清除位而不分支 有条件地否定一个值而不分支 根据掩码合并两个值中的位 计数位设置 计数位设置,幼稚的方式 计算由查找表设置的位 数位集...(后跟) 通过浮法舍入到2的下一个最高幂 向上舍入到2的下一个最高幂 交织位(也称为计算莫顿数) 交错位的明显方式 通过表查找交织位 带64位乘法的交织位 通过二进制幻数交错位 测试单词中的字节范围(并计算出现的次数...) 确定单词是否为零字节 确定一个单词的字节数是否等于n 确定一个单词的字节数是否小于n 确定单词的字节数是否大于n 确定单词是否在m和n之间有一个字节 按词典顺序计算下一位排列 更多内容可以查看: http
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。...1、判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下: if( n % 2) == 01 // n 是个奇数 } 如果把 n 以二进制的形式展示的话,其实我们只需要判断最后一个二进制位是...所以,解释如下: 把(1)中的 x 带入 (2)中的 x,有 y = x^y = (x^y)^y = x^(y^y) = x^0 = x。 x 的值成功赋给了 y。...例如 N = 19,那么转换成二进制就是 00010011(这里为了方便,我采用8位的二进制来表示)。那么我们要找的数就是,把二进制中最左边的 1 保留,后面的 1 全部变为 0。...不过呢,我给出的这些例子中,并不是让你们学会了这些题就 Ok,而且让你们有一个意识:很多时候,位运算是个不错的选择,至少时间效率会快很多,而且高逼格,装逼必备。
作者:帅地 位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。...判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下 if( n % 2) == 01 // n 是个奇数 } 如果把 n 以二进制的形式展示的话,其实我们只需要判断最后一个二进制位是...所以,解释如下: 把(1)中的 x 带入 (2)中的 x,有 y = x^y = (x^y)^y = x^(y^y) = x^0 = x。 x 的值成功赋给了 y。...例如 N = 19,那么转换成二进制就是 00010011(这里为了方便,我采用8位的二进制来表示)。那么我们要找的数就是,把二进制中最左边的 1 保留,后面的 1 全部变为 0。...不过呢,我给出的这些例子中,并不是让你们学会了这些题就 Ok,而且让你们有一个意识:很多时候,位运算是个不错的选择,至少时间效率会快很多,而且高逼格,装逼必备。
你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!...使用按位异或(^)操作找出 x 和 y 的二进制表示中不同的位,结果是一个新整数 s。 调用 hammingWeight 函数统计 s 中的 1 的个数,即为汉明距离。...方法: 通过按位异或(x ^ y)操作,生成一个新的整数 s,其二进制表示中 1 的位置对应 x 和 y 不同的位。...异或规则: 1 ^ 1 = 0 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 因此,s 的二进制中所有的 1 表示 x 和 y 不同的位。...示例运行过程 示例输入 x = 1, y = 4 计算过程 x 的二进制表示:0001 y 的二进制表示:0100 按位异或: x ^ y = 0001 ^ 0100 = 0101
介绍 操作符 功能 & 位逻辑与 l 位逻辑或 ^ 位逻辑异或 ~ 取反运算符 使用 “与”运算符 与运算符的功能是使参与运算的两数各对应的二进制位相“与”,当对应的两个二进制位均为1时,结果为1,否则...“或”运算符 或运算符“|”的功能是使参与运算的两个数各对应的二进制位相“或”,只要对应的两个二进制位有一个为“1”,结果位就为1。...如果想要将一个二进制位数的某几位设置为1,只需将该数与一个这几位都是1的二进制数执行“或”操作即可。...“异或”操作的一个主要用途就是能使特定的位翻转,如果要将一个数的后7位翻转只需要与一个后7位都是1的数进行“异或”操作即可。...循环左移的过程如下: 将x的左端n位先放到z中的低n位中, z=x>>(32-n); 将x左移n位,其右边低n位补0. y=x<<n; 将y与z进行按位“或”运算 y=y|z;
2,得到一个数,将这个数的整数位作为二进制的一位,然后继续取其小数部分乘以 2 作为下一位,直到不存在小数为止 举个例子:3.14(十进制) 整数部分: 3(十进制)-> 0011(二进制) 小数部分...: 0.14 x 2 = 0.28(将十进制 3 中的小数部分 0.14 乘以 2,得到一个数 0.28,将这个数的整数位 0 作为二进制的一位,然后继续取其小数部分乘以 2 作为下一位,直到不存在小数为止...),此时小数部分的二进制表示是 0xxx xxxx 0.28 x 2 = 0.56(将十进制 0.28 中的小数部分 0.28 乘以 2,得到一个数 0.56,将这个数的整数位 0 作为二进制的一位,然后继续取其小数部分乘以...2 作为下一位,直到不存在小数为止),此时小数部分的二进制表示是 00xx xxxx 0.56 x 2 = 1.12(将十进制 0.56 中的小数部分 0.56 乘以 2,得到一个数 1.12,将这个数的整数位...(abs(x - y) < myToleranceValue) { ... } 心之所向,素履以往,我是小牛肉,小伙伴们下篇文章再见
(1)、判断一个正整数 n 是否为 2 的幂次方 如果一个数是 2 的幂次方,意味着 n 的二进制表示中,只有一个位 是1,其他都是0。...(2)、判断 正整数 n 的二进制表示中有多少个 1 例如 n = 13,那么二进制表示为 n = 1101,那么就表示有 3 个1,这道题常规做法还是把 n 不停着除以 2,然后统计除后的结果是否为奇数...n; 特性三:支持交换律和结合律,例如 x ^ ( y ^ x) = (x ^ y) ^ x; 案例1:只出现一次的数 问题:数组中,只有一个数出现一次,剩下都出现两次,找出出现一次的数 数,最后再遍历哈希表...那么大家想一下,还能继续优化吗? 答是可以的,可以用 bitmap 算法,具体我这里不展开,感兴趣看这篇文章:【面试现场】如何判断一个数是否在40亿个整数中?...5、考虑是否可以设置哨兵位来处理临届问题 在链表的相关问题中,我们经常会设置一个头指针,而且这个头指针是不存任何有效数据的,只是为了操作方便,这个头指针我们就可以称之为哨兵位了。
位运算和模运算在日常的应用开发中倒也少见,主要是这两个概念更多是存在于新手教程中一笔带过,很多情况下都是说位运算主要是针对字节位来进行相关的处理,有或与非、异或和取模,这些概念我们也只是知道了一些相关的知识点...0111 与 & 通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。...xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19951223作为密钥。...位1的个数 762. 二进制表示中质数个计算置位 将二进制中最右边的 1 设置为 0:n & (n - 1) 在二进制表示中,数字n 中最低位的1 总是对应n - 1中的0 。...^= y; y ^= x; x ^= y; 列举组合 面试题 08.04.
低位补0 >> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) 一 与运算 & 两位同时为1,结果才为1,否则结果为...2)取一个数的指定位 比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到...1)常用来对一个数据的某些位设置为1 比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=...异或的几条性质: 图片 五 左移 << 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。...六 右移 >> 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 操作数每右移一位,相当于该数除以2。
2进制、8进制、16进制、32进制、64进制等转换成10进制计算方法我得出一个公式:(^表示次方,如:2^2,即2的2次方,8^5即8的5次方) 每位数字转换成10进制时=进制数^(次方)数字索引位(从...16=20 16进制数:0x14(注意0x是用来表示16进制数的意思,不是数字本身的内容)=16^0*4+16^1*1=4+16=20 至于各进制之间的转换,比如:2进制转换成16进制,如果想自己手算,...一般都是先转成10进制,然后将数字进行与进制数相除,直到得出余数小于或等于进制数(或0),当然作为程序员的我们,应该使用现有的方法,如下: Convert.ToString(数字,进制数) 如:Convert.ToString...在这里我要另外讲一下,使用上方Convert.ToString(数字,进制数)转换的时候,转二进制时,左边为0时,0会自动去掉,但是有的时候我们又不希望去掉,因此我想到一种方法是补零。...使用 public String PadLeft(int totalWidth, char paddingChar);进行补零,因为我需要的是得到一个八位的二进制数,所以是PadLeft(8, '0')
位操作(Bit Manipulation)可以有很多技巧,有一个叫做 Bit Twiddling Hacks 的网站收集了几乎所有位操作的黑科技玩法,网址如下: http://graphics.stanford.edu...= -1, y = 2; boolean f = ((x ^ y) < 0); // true int x = 3, y = 2; boolean f = ((x ^ y) 个 1,所以可以用一个循环不停地消除 1 同时计数,直到n变成 0 为止。...一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1: 2^0 = 1 = 0b0001 2^1 = 2 = 0b0010 2^2 = 4 = 0b0100 如果使用n & (n-1)的技巧就很简单了...再回顾一下异或运算的性质:一个数和它本身做异或运算结果为 0,一个数和 0 做异或运算还是它本身。
领取专属 10元无门槛券
手把手带您无忧上云