初步了解位运算

    public static void function1(int n) {
        System.out.println("十转2 8 16");
        //  java进制转换
//        java中进行二进制,八进制,十六进制,十进制间进行相互转换
//        十进制转成十六进制:
        System.out.println(Integer.toHexString(n));
//        十进制转成八进制
        System.out.println(Integer.toOctalString(n));
//        十进制转成二进制
        System.out.println(Integer.toBinaryString(n));
    }

    public static StringBuffer ten(int n) {
//        自己算 十转二
        StringBuffer sb = new StringBuffer();
        int res = 0;
        while (n > 0) {
            res = n % 2; //除2 取余数作为二进制数
            sb.append(res);
            n = n / 2;
        }
        return sb;

    }
public static int two(int bi) {
    //        自己算 二转十
    StringBuffer sb = new StringBuffer().append(bi).reverse();
    int sum = 0;
    int len = sb.length();
    for (int i = 0; i < len; i++) {
        //第i位 的数字为:
        int dt = Integer.parseInt(sb.charAt(i) + "");
        sum += Math.pow(2, i) * dt;
    }
    return sum;
}
从右往左
 

位运算

  int newCapacity = 10 + (10 >> 1);

10000001  左为高  右为低

    int  4个字节byte  32bit位

数字1 转换成 2 进制  以两对4位数呈现 或者以4对4位数呈现 以及8对四位数呈现

 0000 0001   32位

521    10进制

1*10的0次方 =1

2*10的1次方 =20

5*10的2次方 =500

 0000 0101   2对应的2进制

1*2的0次方 =1

0*2的1次方 =0

1*2的2次方 =4

 1+0+4=5

1G=1024MB 计算机在运行时

1G=1000MB 厂家的运算

0101 0101    2进制

原码   ===》我们看到的 源码是我们所看到的计算机高级语言

反码

补码   ===》真正运行的 计算机语言只认识01的补码

01.正数的原码,反码,补码都一致(正数没有补码 因为他的补码就是他的源码)

02.java中所有的数字都是有符号的  符号位 正数0  负数1(最高位 为8位数)

03.负数的反码=符号位不变+其他位取反(1变0 0变1)

04. 每对的最左边叫最高位 每对的最右边是最低位

05.负数的补码=反码+1

例子: 1-2

 先把1转换成2进制

 0 0 0 0 0 0 0 1

 把-2转换成2进制

 1 0 0 0 0 0 1 0    -2的源码

 1 1 1 1 1 1 0 1    -2的反码

 1 1 1 1 1 1 1 0    -2的补码

   0 0 0 0 0 0 0 1   1的补码

+  1 1 1 1 1 1 1 0

============================

   1 1 1 1 1 1 1 1    结果的补码

   1 1 1 1 1 1 1 0    结果的反码

   1 0 0 0 0 0 0 1    结果的原码   -1      

例子: 4-3   

 先把4转换成2进制

 0 0 0 0 0 1 0 0

 把-3转换成2进制

 1 0 0 0 0 0 1 1   -3的源码

 1 1 1 1 1 1 0 0   -3的反码

 1 1 1 1 1 1 0 1   -3的补码

+0 0 0 0 0 1 0 0

==========================

 0 0 0 0 0 0 0 1  结果的补码

算术右移

int newCapacity = 10 + (10 >> 1);

先算出10的2进制

0 0 0 0 1 0 1 0

  0 0 0 0 1 0 1 0    符号位不变,低位溢出删除,高位补零!

==========================================

0 0 0 0 0 1 0 1

算术左移

10 << 1

   先算出10的2进制

   0 0 0 0 1 0 1 0

 0 0 0 0 1 0 1 0     符号位不变,高位溢出删除,低位补零!

 ==============================

   0 0 0 1 0 1 0 0    20

怎么以最快的速度从2 变成 8

    先算出2的2进制

    0 0 0 0 0 0 1 0

0 0 0 0 0 0 1 0     2<<2

============================

    0 0 0 0 1 0 0 0    8

逻辑右移:不管符号位!低位溢出删除,高位补零!

10>>>2

    先算出10的2进制

    0 0 0 0 1 0 1 0&

        0 0 0 0 1 0 1 0

=======================

    0 0 0 0 0 0 1 0

-1

  1 0 0 0 0 0 0 1  原码

  1 1 1 1 1 1 1 0  反码

  1 1 1 1 1 1 1 1  补码   >>>1

    1 1 1 1 1 1 1 1

========================

  0 1 1 1 1 1 1 1

&& || !   逻辑与或非   短路与或非  返回的都是boolean类型的值

位运算: 

按位与 &   两位都为1,结果为1

  3&4

  0 0 0 0 0 0 1 1

& 0 0 0 0 0 1 0 0

===========================

  0 0 0 0 0 0 0 0

  

  

按位或 |   两位有一位为1,结果为1

  3|2

  0 0 0 0 0 0 1 1

| 0 0 0 0 0 0 1 0

===========================

  0 0 0 0 0 0 1 1

按位异或 ^   必须是一位是0,一位是1,结果才为1

  3^4

  0 0 0 0 0 0 1 1

^ 0 0 0 0 0 1 0 0

===========================

  0 0 0 0 0 1 1 1

按位取反 ~  : 就是数值+1之后取相反的值

 ~3

~  0 0 0 0 0 0 1 1

=========================

   1 1 1 1 1 1 0 0    负数

   1 0 0 0 0 0 1 1    反码

   1 0 0 0 0 1 0 0

        System.out.println(2 >> 1); //算术右移
        /*
         *   0000 0010  2
         *    0000 0010   2
         * _________________________
         *   0000 0001    1
         * */
        System.out.println(2 << 1);//算术左移
        /*
         *   0000 0010  2
         *  0000 0010   2
         * _________________________
         *   0000 0100    4
         * */
        System.out.println(2 >>> 1);//逻辑右移
        /*
         *   0000 0010  2
         *    0000 0010   2
         * _________________________
         *   0000 0001    1
         * */
        System.out.println(2 | 1);
        /*
         *   0000 0010  2
         *   0000 0001  1
         * _________________________
         *   0000 0011  3
         * */
        System.out.println(2 & 1);
        /*
         *   0000 0010  2
         *   0000 0001  1
         * _________________________
         *   0000 0000 0
         * */
        System.out.println(~2);
        /*
         *   0000 0010  2  源码
         *   1000 0010  2  负数
         *   1111 1101  3  反码
         * */
        System.out.println(2 - 1);
        /*
         *   1000 0001   -1 源码
         *   1111 1110   -1 反码
         *   1111 1111   -1 补码
         *
         *   0000 0010   2 源码
         * + 1111 1111  -1 补码
         *  ------------------------
         *   0000 0001  1的源码
         * */
        System.out.println(1 - 2);
        /*
         *   1 0 0 0 0 0 1 0    -2的源码
         *   1 1 1 1 1 1 0 1    -2的反码
         *   1 1 1 1 1 1 1 0    -2的补码
         *   0 0 0 0 0 0 0 1     1的补码
         * + 1 1 1 1 1 1 1 0
         *  ----------------------
         *   1 1 1 1 1 1 1 1    -1结果的补码
         *   1 1 1 1 1 1 1 0    -1结果的反码
         *   1 0 0 0 0 0 0 1    -1结果的原码   -
         * */
原文地址:https://www.cnblogs.com/liehuonanjue/p/9293075.html