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
  • 相关阅读:
    ORACLE的主要进程DBWn,LGWR的工作原理
    ORACLE PGA
    如何精确获取ORACLE的秒?
    Dictionary.TryGetValue 方法 试用记 Mark
    在C#中如何实现Form与Form之间的通信
    在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 无法打开到 SQL Server 的连接)
    在C#程序中实现插件架构
    兄弟,你有弄过TestDriven.NET吗?
    由C#风潮想起的-给初学编程者的忠告
    今天真是不在状态的一天,又是一个书写的错误(本文仅为提醒自己,你可以选择跳过)
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13573017.html
Copyright © 2011-2022 走看看