位运算

public class Test {
    public static void main(String[] args) {
        // 1、左移( << )
        // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
        // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
        System.out.println(5 << 2);// 运行结果是20

        // 2、右移( >> ) 高位补符号位
        // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
        // 0000 0000 0000 0000 0000 0000 0000 0001
        System.out.println(5 >> 2);// 运行结果是1
        // 3、无符号右移( >>> ) 高位补0
        // 例如 -5换算成二进制后为:0101 取反加1为1011
        // 1111 1111 1111 1111 1111 1111 1111 1011
        // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
        System.out.println(5 >> 3);// 结果是0
        System.out.println(-5 >> 3);// 结果是-1
        System.out.println(-5 >>> 3);// 结果是536870911

        // 4、位与( & )
        // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
        System.out.println(5 & 3);// 结果为1
        System.out.println(4 & 1);// 结果为0

        // 5、位或( | )
        // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
        System.out.println(5 | 3);// 结果为7

        // 6、位异或( ^ )
        // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
        System.out.println(5 ^ 3);//结果为6

        // 7、位非( ~ )
        // 操作数的第n位为1,那么结果的第n位为0,反之。
        System.out.println(~5);// 结果为-6
    }
}
Code copy


 1 public class SuanFaTest {
 2 
 3     //此方法的时间复杂度是O(LogN)
 4     public static boolean ispowerOf2_(Integer number) {
 5         int temp = 1;
 6         while (temp <= number) {
 7             if (temp == number) {
 8                 return true;
 9             }
10             //左移一位  数学意义等同于乘以2
11             temp = temp * 2;
12         }
13         return false;
14     }
15 
16     //此方法的时间复杂度是O(LogN)
17     public static boolean ispowerOf2_initiate(Integer number) {
18         int temp = 1;
19         while (temp <= number) {
20             if (temp == number) {
21                 return true;
22             }
23             //左移一位  数学意义等同于乘以2
24             temp = temp << 1;
25         }
26         return false;
27     }
28 
29     //算法时间复杂度是O(1)
30     public static boolean isPowerOf2_final(Integer number) {
31         return (number & number - 1) == 0;
32     }
33 
34     public static void main(String[] s){
35         System.out.println(ispowerOf2_(7));
36         System.out.println(ispowerOf2_initiate(7));
37         System.out.println(isPowerOf2_final(7));
38     }
39 }
                带符号右移就是将那个数转为2进制然后在前面补0或1
如果是正数就补0
负数补1
         右移一位相当于除2,右移n位相当于除以2的n次方。


加密

1 一个数异或同一个数两次还是原数;


/**
 * Created by YaoJia on 2016/11/24 0024.
 */
public class YiHuo {


    public static void main (String[] aa){
        System.out.println();

        int a=1;
        int b=2;

        System.out.println("a:"+a +" "+ "b:"+b);
        a = a ^ b;
        System.out.println("a = a ^ b之后-->"+"a:"+a +" "+ "b:"+b);
        b = a ^ b;  //实际上是(a^b)^b 也就是a异或了b两次,等号右边是a的值
        System.out.println("b = a ^ b之后-->"+"a:"+a +" "+ "b:"+b);
        a = a ^ b;  //此时b里面已经是“果汁”,实际上是(a^b)^a,也就是b异或了a两次,是b
        System.out.println("a = a ^ b之后-->"+"a:"+a +" "+ "b:"+b);

    }



}
View Code





原文地址:https://www.cnblogs.com/cn-jag/p/6098915.html