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