前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫画:位运算技巧整理汇总+一道被嫌弃的题目

漫画:位运算技巧整理汇总+一道被嫌弃的题目

作者头像
程序员小浩
发布2020-03-30 15:03:14
4200
发布2020-03-30 15:03:14
举报
文章被收录于专栏:小浩算法小浩算法

今天是小浩算法“365刷题计划”第65天。这两天总有人来问我,做公众号赚了多少钱,或者就是怎么能和你一样,2个月就做到7000粉丝。说实话,至少到目前为止,我一分钱都没赚(打赏的百十块也都红包发出去了),以后赚不赚不好说,毕竟人要吃喝,我也不例外。但是至少目前我认为还没准备好,也不是没有广告商来找,我都委婉拒掉了。另外细心的读者会发现,我连文末的广告都没有开。另外,关于粉丝的增长,我觉得就是单纯的创作,坚持写好文章而已。可能和别的博主不一样,他们有的内容和运营的时间比,在5:5,我大概只有9:1,毕竟我还得上班。而且我不太会弄一些浮夸的标题(太笨编不来),也不会引流,那就只能每天把一个题解写对再写好,争取大家能看懂。不会写得太长,让你们觉得枯燥,不会写的特别短,让你们厌烦。这就是目前我所有能做的想做的了,其他的,以后再说。好了,废话就到这里,今天将分享一道很简单,并且总被Diss的题目:

01 PART

两数之和

这个题很老了,拿出来给不会的同学看一看,会的直接跳过。(值得一说的是,这个题目在国外上,有2000个dislike,可以看到大家的嫌弃!)

第268题:不使用运算符 + 和 - ,计算两整数 a 、b 之和。

02 PART

位运算求解

位运算的题,大部分都有一些特别的技巧,只要能掌握这些技巧,对其拼装组合,就可以破解一道道的题目。很多人说那些技巧想不到,我觉得是因为没有认真的去学习和记忆。你要相信,基本上所有人最开始都是不会的,只是后来他们通过努力学会了记住了,而你因为没努力一直停留在不会而已。不要觉得那些一眼看到题就能想到解法的人有多么了不起。“无他,唯手熟尔!”

下面这两个技巧大家需要记住,这也是讲解本题的目的:

“异或”是一个无进位加法,说白了就是把进位砍掉。比如01^01=00。

“与”可以用来获取进位,比如01&01=01,然后再把结果左移一位,就可以获取进位结果。

根据上面两个技巧,假设有 12+7:

根据分析,完成题解:

代码语言:javascript
复制
//JAVA
class Solution {
    public int getSum(int a, int b){
        while(b != 0){
            int temp = a ^ b;
            b = (a & b) << 1;
            a = temp;
        }
        return a;
    }
}
  • 本系列所有教程都不会用到复杂的语言特性,不需要担心没有学过相关语法,使用各语言纯属本人爱好。
  • 作为学术文章,虽然风格可以风趣,但严谨,我是认真的。本文所有代码均在leetcode上进行过测试运行。
  • 算法思想才是最重要的。

03 PART

位运算技巧总结

为了大家方便学习,我对位运算的常见面试题技巧进行了总结。

首先,常见的位运算包括:

Operators

Meaning of operators

&

Bitwise AND,按位与

|

Bitwise OR,按位或

^

Bitwise XOR,按位异或

~

Bitwise complement,按位取反

<<

Shift left,左移

>>

Shift right,右移

基本的操作我就直接略过了。下面是我认为必须掌握的技巧:(注意,我把一些生僻的技巧都已经砍掉了,留下来的,就是我认为应该会的)

1、使用 x & 1 == 1 判断奇偶数。(注意,一些编辑器底层会把用%判断奇偶数的代码,自动优化成位运算)

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 相加,相当于把所有二进制位设为1,其十进制结果为-1。

6、对于int32而言,使用 n >> 31取得 n 的正负号。并且可以通过 (n ^ (n >> 31)) - (n >> 31) 来得到绝对值。(n为正,n >> 31 的所有位等于0。若n为负数,n >> 31 的所有位等于1,其值等于-1)

7、使用 (x ^ y) >= 0 来判断符号是否相同。(如果两个数都是正数,则二进制的第一位均为0,x^y=0;如果两个数都是负数,则二进制的第一位均为1;x^y=0 如果两个数符号相反,则二进制的第一位相反,x^y=1。有0的情况例外,^相同得0,不同得1)

第一版先整理这些吧,后续再逐步补充。想复习一下其他位运算题目的,可以看:

漫画:位运算系列篇(缺失数字)

漫画:位运算系列篇(只出现一次的数字)

漫画:位运算系列篇(只出现一次的数字 - 进阶版)

漫画:三分钟学习一道位运算的面试题,万一遇到了呢?

漫画:位运算技巧助你俘获offer

所以,今天的问题你学会了吗?评论区留下你的想法!

小浩算法,每日一题

关注领取《图解算法》高清版

进群的小伙伴请加右侧私人微信(备注:进群)

第一版先整理这些吧,后续再逐步补充。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小浩算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档