• 位运算符计算(转载)


    今天看代码遇到位运算符,因为不常用已经忘记了,所以复习一下。Java位运算符包括:位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>' 。

    位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。运算需要用到一些二进制知识,稍微回顾一下。这里有一篇介绍二进制、原码、反码和补码的文章:https://blog.csdn.net/vickyway/article/details/48788769。比较详细,这里不再赘述了。

    下面代码中有具体计算过程(稍需注意的是,Java中int类型是32bit)

    //java中包含运算符 = 位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>'
    //参与位运算的数字都是二进制补码的方式进行按位与、或、异或,正数的反码、补码都是其本身

    //1. '&' 位与运算符(两个操作数都为1,结果才为1,否则结果为0)
    System.out.print("1&-3 = ");
    System.out.println(1&-3);
    /*计算过程(使用补码)
    1: 00000000 00000000 00000000 00000001
    -3: 11111111 11111111 11111111 11111101
    结果: 00000000 00000000 00000000 00000001 (结果也是补码,因为是正数,原码相同) 1
    */

    //2. '|' 位或运算符(两个位只要有一个为1,那么结果就是1,否则就为0)
    System.out.print("1|-3 = ");
    System.out.println(1|-3);
    /*计算过程(使用补码)
    1: 00000000 00000000 00000000 00000001
    -3: 11111111 11111111 11111111 11111101
    结果: 11111111 11111111 11111111 11111101 (结果也是补码,转成原码 10000000 00000000 00000000 00000011) -3
    */

    //3. '~' 位非运算符(如果位为0,结果是1,如果位为1,结果是0)
    System.out.print("~-3 = ");
    System.out.println(~-3);
    /*计算过程(使用补码)
    -3: 11111111 11111111 11111111 11111101
    结果: 00000000 00000000 00000000 00000010 (正数,原码相同) 2
    */

    //4. '^' 位异或运算符(两个操作数,相同则结果为0,不同则结果为1)
    System.out.print("1^-3 = ");
    System.out.println(1^-3);
    /*计算过程(使用补码)
    1: 00000000 00000000 00000000 00000001
    -3: 11111111 11111111 11111111 11111101
    结果: 11111111 11111111 11111111 11111100 (转成原码:10000000 00000000 00000000 0000 0100) -4
    */

    //5. '<<' 左移运算符(左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0))
    System.out.print("-3<<2 = ");
    System.out.println(-3<<2);
    /*计算过程(使用补码)
    -3: 11111111 11111111 11111111 11111101
    结果: 11111111 11111111 11111111 11110100 (转成原码:10000000 00000000 00000000 00001100) -12
    */

    //6. '>>' 右移运算符("有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。如果值为正,则在高位补0,如果值为负,则在高位补1.)
    System.out.print("-3>>2 = ");
    System.out.println(-3>>2);
    /*计算过程(使用补码)
    -3: 11111111 11111111 11111111 11111101
    结果: 11111111 11111111 11111111 11111111 (转成原码:10000000 00000000 00000000 00000001) -1
    */

    //7. '>>>' 右移运算符("无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。无论值的正负,都在高位补0.)
    System.out.print("-3>>>2 = ");
    System.out.println(-3>>>2);
    /*计算过程(使用补码)
    -3: 11111111 11111111 11111111 11111101
    结果: 00111111 11111111 11111111 11111111 2^30次方 - 1 = 1073741823

  • 相关阅读:
    读取目录中文件名的方法 C++
    std::string::compare() in C++
    std::string::erase in C++ 之 erase()方法截取string的前几位、后几位
    Source Insight 破解
    bib+windows+word=bibtex4word插件使用方法
    7K7K小游戏
    Linux+Gurobi-python调用
    使用位运算替代模运算,为了高效做模除最好选择mod除(2^n)
    windows+VS2019+gurobi解决方案配置
    The plagiarism
  • 原文地址:https://www.cnblogs.com/tnt-33/p/11381807.html
Copyright © 2020-2023  润新知