剑指offer笔记

位运算

  1. 左移运算符m«n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0

    00001010<<2=00101000zz
    
    • 左移运算符<<是双目运算符。左移n位就是乘以2的n次方。其功能把<<左边的运算数的各二进制全部左移若干位,由<<右边的数指定移动的位数,高位丢弃,低位补0
    • 右移运算符>>是双目运算符。右移n位就是除以2的n次方。其功能是把>>左边的运算数的各二进制位全部右移若干位,>>右边的数指定移动的位数。
  2. 右移运算负m»n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边的情形要稍微复杂一点。如果数字是一个无符号的数值,则用0填补最左边的n位。如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。如果原数字原生是一个正数,则右移之后在左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。

    00001010>>2=00000010
    10001010>>3=11110001
    
  3. 如果一个整数不等于0,那么该整数得二进制表示中至少有一位是1。面试题10:二进制中1的个数

    解题思路
    假设这个数的最右边一位是1,那么减去1时,最后一位变成0而其他所有位都保持不变。也就是最后一位相当于做了取反操作,由1变成了0。
    假设最后一位不是1而是0的情况。如果该整数的二进制表示最右边1位等于m位,那么减去1时,第m位由1变成0,而第m位之后的所有0都变成1,整数中第m位之前的所有位都保存不变。如1100=>1011
    

    把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多个1,就可以进行多少次这样的操作 相关题目

    用一条语句判断一个整数是不是2的整数次方。一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他位都是0。把这个整数减去1之后再和它自己做与运算,这个整数中唯一的1就会变成0。

    输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。分两步:第一步求这两个数的异或(^),第二步统计异或结果中1的位数

  4. 举一反三 把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。

高质量的代码

  1. 由于精度原因不能用等号判断两个小数是否相等

    double b1,b2;
    if(b1==b2)这种做法会给面试人带来很差的映像
    
  2. 代码的规范性 清晰的书写清晰的布局合理的命名=>规范的代码。 tips:应聘者在写代码的时候,最好用完整的英文单词组合命名变量和函数,以便面试官能一眼读懂代码的意图。

  3. 代码的完整性 代码是否完成了基本功能、输入边界值是否能得到正确的输出、是否对各种不合规范的非法输入做出了合理的错误处理。

  4. 从以下三方面确保代码的完整性:功能测试,边界测试和负面测试三方面设计测试用例。

  5. 三种错误处理的放 第一种方式是函数用返回值来告知调用者是否出错。 第二种方式是当发生错误时设置一个全局变量。 第三种方式是异常

    下表是 返回值、全局变量和异常三种错误处理方式的优缺点比较

      优点 缺点
    返回值 和系统API一致 不能方便地使用计算结果
    全局变量 能够方便地使用计算结果 用户可能会忘记检查全局变量
    异常 可以为不同的出错原因定义不同异常类型,逻辑清晰明了 有些语言不支持异常,抛出异常时对性能有负面影响
Table of Contents