zoukankan      html  css  js  c++  java
  • java位运算

    一、异或运算^

      1、基本特性  

        (1)0^0=0 , 1^0=1 任何数异或0 不变

        (2)0^1=1 , 1^1=0 任何数异或1 取反 , 如果想将某一个位反转,只需异或1就行

        (3)任何数异或自己 变成0

        (4)异或满足交换律

      2、使用异或的案例

        (1)交换两个数不需要使用额外空间:自己异或自己为0,任何数异或0不变,异或满足交换律

          两个数A,B。通过如下方法实现交换A,B:

          A = A ^ B;
          B = B ^ A;
          A = A ^ B;

        (2)一个整形数组,其中所有的数都出现了两次,除了有两个数只出现一次之外。如何在最短的时间内获取到这两个数。

    二、移位运算

      在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。如下:

        16>>34和16>>2 结果相同

        16>>32 结果还是16

      1、右移(>>):移动时低位舍弃 

       (1) 正数右移时,高位补0

       (2)负数右移时,符号位不变:1,右移后空出来的高位全补1

        如 -16>>2 = -4

        -16 原码:1000 0000 0000 0000 0000 0000 0001 0000

        -16 反码:1111 1111 1111 1111 1111 1111 1110 1111

        -16 补码:1111 1111 1111 1111 1111 1111 1111 0000(反码加1)

        右移2位: 1111 1111 1111 1111 1111 1111 1111 1100(补码)

        转换为原码: 1000 0000 0000 0000 0000 0000 0000 0100 (结果为-4)

      2、>>> 无符号右移:不管正负数,带符号移动后,空出来的高位补0 

        -16>>>2 = 1073741820

        -16 补码:1111 1111 1111 1111 1111 1111 1111 0000

     无符号右移2位: 0011 1111 1111 1111 1111 1111 1111 1100(补码,由于符号位为0,为正数)

        结果为: 1073741820 //使用Integer.toBinaryString(1073741820)可以验证   

      3、左移(<<):按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零  

        左移的规则只记住一点:丢弃最高位(符号位同样丢弃),0补最低位  (由于是负数,补码左移后结果还是负数)

        -16<<2 = -64  

  • 相关阅读:
    docker添加sudo权限
    服务器出口ip
    flask
    ACM-奇特的立方体
    ACM-牛喝水
    ACM-可乐兑换
    ACM-Work Assignment
    ACM-DFS Template
    ACM-Checker Challenge
    ACM-Divide Tree
  • 原文地址:https://www.cnblogs.com/ljdblog/p/5938580.html
Copyright © 2011-2022 走看看