JavaIO之位运算与编码


一、 位运算

1.1 按位与(&)

(1)快速清零。只要与一个各位都为0的数相与,结果为0。
(2)取得一个数中的指定位。

设X=10101110,要取得X的低4位,用X & 0000 1111 = 0000 1110,即可得到X的低四位。


1.2 按位或(|)

可用于将一个数据的某些位置为1。

将X=10100000的低四位置1,用X | 0000 1111 = 1010 1111即可将X的低四位置为1。


1.3 异或运算(^)

(1)与0相异或,保留原值;
(2)使特定位取反

X = 1010 1110 ^ 0000 0000 = 1010 1110,X仍然是原来的值。X低4位取反,用X ^ 0000 1111 = 1010 0001。

【代码】用三种方法实现交换两个变量值

    public void swap1(int a,int b){ //利用临时变量实现两个值交换
        int temp;
        temp = a;
        a = b;
        b = temp;
        System.out.println("a="+a+",b="+b);
    }

    public void swap2(int a,int b){ //利用加减法实现
        a = a+b;
        b = a-b;
        a = a-b;
        System.out.println("a="+a+",b="+b);
    }

    public void swap3(int a,int b){ //用异或运算实现,效率最高
        a = a^b;
        b = a^b; //即 b = (a^b)^b = a
        a = a^b; //即 a = (a^b)^a = b
        System.out.println("a="+a+",b="+b);
    }


1.4 移位运算

 (1)左移运算(<<):左边的二进制位丢弃,右边补零。若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
 (2)右移运算(>>):右边的二进制位丢弃,正数左补0,负数左补1。操作数每右移一位,相当于该数除以2。
 (3)无符号右移(>>>):各个位向右移指定的位数,右边丢弃,左边空出的位用0来填充。

【代码】进制转换

    public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(112)); //10->2 1110000
        System.out.println(Integer.toHexString(112));  //10->16  70
        System.out.println(Integer.toOctalString(112)); //10->8  160

        System.out.println(Integer.parseInt("111001", 2));//2->10  57
        System.out.println(Integer.parseInt("3752", 8));//8->10  2026
        System.out.println(Integer.parseInt("A9", 16));//16->10  169
    }


二、 编码

2.1 将字符串转换成字节序列

getBytes()方法可以将字符串按照指定的编码格式转换成字节序列。
    String s = "慕课ABC";

    //转换成字节序列,以项目默认的编码方式GBK进行编码
    byte[] bytes1 = s.getBytes(); 
    //把数组中的字节转换成16进制打印出来  c4 bd bf ce 41 42 43
    for(byte b:bytes1){
        System.out.print(Integer.toHexString(b & 0xff)+" ");
    }//GBK编码中文占用2个字节,英文占用一个字节
    System.out.println();

    //以utf-8进行编码
    byte[] bytes2 = s.getBytes("utf-8");
    for(byte b:bytes2){
        System.out.print(Integer.toHexString(b & 0xff)+" ");
    }//UTF-8中文占3个字节,英文占用1个字节 e6 85 95 e8 af be 41 42 43 
    System.out.println();

    //java的双字节编码
    byte[] bytes3 = s.getBytes("utf-16be");
    for(byte b:bytes3){
        System.out.print(Integer.toHexString(b & 0xff)+" ");
    }//utf-16be中文英文均占2个字节  61 55 8b fe 0 41 0 42 0 43


2.2 将字节序列转换成字符串

通过构造String对象,使用合适的编码格式,可以将字节序列转换成字符串。
    // 当字节序列是某种编码时,转换成字符串还需要使用该编码,否则会乱码
    System.out.println();
    String str1 = new String(bytes3);
    System.out.println(str1);//aU孇 ABC  乱码

    String str2 = new String(bytes3,"utf-16be");
    System.out.println(str2);//慕课ABC

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

点赞