美文网首页
位运算符的陷阱

位运算符的陷阱

作者: 进击的NULL | 来源:发表于2019-01-08 11:45 被阅读0次

背景

今天在写代码计算二叉树根节点右孩子的下标值时,用了如下代码:

/**
     * 获取根节点右孩子的的下标值
     * @param i
     * @return
     */
    private int right(int i) {
        return i << 1 + 1; // 右孩子为右移一位 + 1
    }

当我发现程序结果跟我预期不一样时,调试到此处,发现right(1)返回的结果是4!所以借此记录,只有踩坑的方式补基础知识记忆才比较靠谱!后来我改成了如下代码,就完美解决问题了。

/**
     * 获取根节点右孩子的的下标值
     * @param i
     * @return
     */
    private int right(int i) {
        return (i << 1) + 1; // 右孩子为右移一位 + 1
    }

踩坑之后

遇到上面问题之后,我回顾了下运算符(主要还是位运算符,刻骨铭心)几点tips:

  • 怕错就用括号,括号优先级是最高的
  • 位运算符优先级没有‘+’(加号优先级高),所以作者上面错了
  • 因为还用到了三元运算符的嵌套,所以看了下,发现三元运算符由右向左以(?:)为一对进行运算(我想了下,也是有语言自己设计的道理)。我用到的代码如下,可以不用加括号,但是最开始作者怕错了,还是把括号加上了(this.arr[i] != INF ? true : false)。
/**
     * 检查一个下标是否魏越界或者是否存储了实际值
     * @param i
     * @return 在数组范围内返回true,越界返回false
     */
    private boolean isLegal(int i) {
        return 1 <= i && i <= this.size() ? this.arr[i] != INF ? true : false : false; // 首先判断数组下标越界与否,在没有越界的基础上还需要判断是否是有效值
    }

补一张运算符优先级的图,虽然我知道我不怎么会看,便于参考吧。


运算符的优先级.png

相关文章

  • 位运算符的陷阱

    背景 今天在写代码计算二叉树根节点右孩子的下标值时,用了如下代码: 当我发现程序结果跟我预期不一样时,调试到此处,...

  • 疯狂Java笔记之面向对象的陷阱

    instanceof运算符的陷阱 instanceof是一个非常简单的运算符。instanceof运算符的前一个操...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作 位与运算符 位与运算符(&)可以对两个数的比特位进行...

  • 位运算符

    位取反运算符 取反翻运算符 ~ 是对所有位的数字进行取反操作0 变 11 变 0 位与运算符 位与运算符 & 可以...

  • 基础运算符

    [使1. 按位与运算符(&](#1. 按位与运算符(&)[按位或运算符 | ](#2. 按位或运算符(|)) 1....

  • python学习第二天 基础知识二

    运算符 +、-、、/、//(整除)、*(幂运算符)、%(取余) 输出结果 位运算符 &位与,|位或,左移<<,右移...

  • 高级运算符(Advanced Operators)

    目录 [toc] 位运算符 1. 按位取反运算符~ 2. 按位与运算符& 3. 按位或运算符| 4. 按位异或运算...

  • swift-位运算符

    1. 位取反运算符( ~ ) 位取反运算符(~ )是对所有位的数字进行取反操作 2. 位与运算符( &) 位与运算...

网友评论

      本文标题:位运算符的陷阱

      本文链接:https://www.haomeiwen.com/subject/kvsvrqtx.html