zoukankan      html  css  js  c++  java
  • Java中的位运算符

    字面量的八进制和十六进制

    以0开头的整数为八进制

    • 05就是5 5*8^0=5
    • 011就是9 1*8+1*8^0=8+1=9

    以0x开头的整数为十六进制

    • 0xF就是15
    • 0x11就是17 1*16+1*16^0=16+1=17
    public class LiteralNumber {
        public static void main(String[] args) {
            int a = 05;
            int b = 011;
            int c = 0xF;
            // 16进制的数值写成:0x或者0X都行
            int d = 0X11;
    
            System.out.println(a);
            System.out.println(b);
            System.out.println(c);
            System.out.println(d);
        }
    }

    按位运算符

    • 按位并 &(and)
    • 按位或 |(or)
    • 按位异或 ^(xor)
    • 按位取反 ~(~)
    public class BitCalc {
        public static void main(String[] args) {
            // 二进制的 1111 1000
            int a = 0xF8;
            // 二进制的 1111 0100
            int b = 0xF4;
            // 二进制的 1111 1111
            int c = 0xFF;
    
            System.out.println(a&b);
            System.out.println(a|b);
            System.out.println(a^b);
    
            System.out.println(~c);
        }
    }

    位移运算符

    • >> :符号不动,其余右移,符号位后面正数补0,负数补1,又称带符号右移(效果是每移动一位,数值上会减少为原值绝对值的一半。但是符号是不变的。)
    • >>> :符号位一起右移,左边补0,又称无符号位右移(如果原值为负数,那么右移会使数值变得非常大;如果原值为正数,那么效果同上面的>>运算符一样。)
    • << :左移,右边补0,左移没有符号位一说,因为符号位在最左侧。(效果是每移动一位,数值上会增加为原值绝对值的一倍。但是符号是不变的。)
    • 位运算符不会改变原变量的值。
    public class BitShift {
        public static void main(String[] args){
            int a = 0x400; // 二进制为1024
            System.out.println(a);
            System.out.println(a >> 1); // 右移一位减少一半
            System.out.println(a >> 2);
    
            System.out.println(a << 1); // 左移一位增加一倍
            System.out.println(a << 2);
    
            int b = -0x400;
            System.out.println(b);
            System.out.println(b >> 1); // 带符号右移一位绝对值同样减少一半,然后带上符号(-)
            System.out.println(b >> 2);
    
            System.out.println(b << 1); // 带符号左移一位,绝对值增加一倍,然后带上符号(-)
            System.out.println(b << 2);
    
            System.out.println(b >>> 1);
            System.out.println(b >>> 2);
        }
    }

    位运算符的用处

    按位运算符:掩码(mask)

    位移运算符:右移高效除以2(正数)

    public class BitOprtUsage {
        public static void main(String[] args) {
            // 掩码操作
            int base = 1;
            // 0001
            int is_student_mask = base;
            // 0010
            int is_programer_mask = base << 1;
            // 0100
            int is_driver_mask = base << 2;
            // 1000
            int is_painter_mask = base << 3;
    
            // 二进制是0101
            int data = 5;
    
            // 0101 & 0001 = 1
            boolean isStudent = (data & is_student_mask) != 0;
            System.out.println(isStudent);
    
            // 0101 & 0010 = 0
            boolean isProgramer = (data & is_programer_mask) != 0;
            System.out.println(isProgramer);
    
            // 0101 & 0100 = 0100
            boolean isDriver = (data & is_driver_mask) != 0;
            System.out.println(isDriver);
    
            // 0101 & 1000 = 0
            boolean isPainter = (data & is_painter_mask) != 0;
            System.out.println(isPainter);
        }
    }
  • 相关阅读:
    关于字符编码
    cocosbuilder中使用字体描边时,字符重叠,间距过小问题
    2dx关于js响应layer触摸消息的bug
    关于js-binding中Layer触摸事件的优化
    2dx解析cocosbuilder中使用layer时的缺陷
    关于 2dx v3.7 UIScale9Sprite的bug
    c++11 Chrono时间库
    cocos2d-x lua table数据存储
    cocos2d-x lua 使用ListView
    Oracle数据库impdp时ora-00439:未启用功能:Deferred Segment Creation
  • 原文地址:https://www.cnblogs.com/buildnewhomeland/p/12110043.html
Copyright © 2011-2022 走看看