zoukankan      html  css  js  c++  java
  • 14.Java位运算符

       位运算符

    按位操作符用来操作整数基本数据类型中的单个比特(bit),就是二进制,按位操作符会对两个参数中对应的位(bit)执行布尔运算,最终生成一个结果。按位操作符来源于C语言面向底层的操作,Java设计的初衷是嵌入式电视机机顶盒,所以面向底层的操作也保留了下来。

    任何信息在计算机中都是以二进制的形式保存的,”&”、“|”、“^”除了可以作为逻辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。他们对两个操作数中的每一个二进制位都进行运算。例如int是由32个二进制数组成,因此使用位运算符可以对整数值的二进制数进行运算。

    位(bit)运算符:

    位运算符

     

    运算符含义

     

    &

    与(AND)

    |

    或(OR)

    ^

    异或

    ~

    取反

    规则:

    可以把1当做true 0当做false

    只有参与运算的两位都为1,&运算的结果才为1,否则就为0。

    只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。

    只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。

    1& 与运算

    & 参见运算的两位数都为1,&运算符结果才为1,否则就为0。

    6&3

    00000000

    00000000

    00000000

    00000110

    6

    00000000

    00000000

    00000000

    00000011

    3

    00000000

    00000000

    00000000

    00000010

    &  =2

    2| 或运算

    | 参与运算的两位都为0,|运算的结果才为0,否则就为1。

    00000000

    00000000

    00000000

    00000110

    6

    00000000

    00000000

    00000000

    00000011

    3

    00000000

    00000000

    00000000

    00000111

    |  =7

    3^ 异或运算

    ^只有参加运算的两位不同,^运算的结果才为1,否则就为0。

    00000000

    00000000

    00000000

    00000110

    6

    00000000

    00000000

    00000000

    00000011

    3

    00000000

    00000000

    00000000

    00000101

    ^  =5

    1、 ~ 反码

    就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    6

    1111-1111

    1111-1111

    1111-1111

    1111-1001

    取反 -7

    System.out.println(~6);//-7

    结论:当参与取反的数值是正数时,把对应的值加上负号,再-1;

          当参与取反的数值是负数时,把对应的值加上负号,再-1;

    负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1。

    4、负数表示

    负数对应的正数的二进制-1,然后取反。

    -6

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    6

    1111-1111

    1111-1111

    1111-1111

    1111-1001

    取反

    1111-1111

    1111-1111

    1111-1111

    1111-1010

    加1

    5、异或特点

    一个数异或同一个数两次,结果还是那个数.  用处一个简单的加密思想.

    6^3^3

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    6

    0000-0000

    0000-0000

    0000-0000

    0000-0011

    ^3

    0000-0000

    0000-0000

    0000-0000

    0000-0101

    0000-0000

    0000-0000

    0000-0000

    0000-0011

    ^3

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    结果是6

    除了这些位运算操作,还可以对数据按二进制位进行移位操作,Java的移位运算符有三种。

    练习:取出一个二进制的某一段。

     

    使用异或(^)数据对数据加密

    对两个变量的值进行互换。

    方式1:

    对两个变量进行值交换(不能使用第三个变量)

    方式2:

    两个数相加的时候,值有可能超出int表示范围,不推荐。

    方式3:

    该方式虽然效率高,而且避免了超出int值,但是可读性较差。

    三种方式都可以对两个变量的值进行交换,但是推荐使用第一种。(面试除外)

    author@nohert
  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13573017.html
Copyright © 2011-2022 走看看