一. 简介
package b_operator;
public class F_Radix {
public static void main(String[] args) {
/*
* 进制
*/
int a = 10; // 默认为十进制
int b = 0b10; // 二进制以0B开头
int c = 010; // 八进制以0开头
int d = 0X10; // 十六进制以0x开头
// 输出十进制
System.out.println("a=" + a + ", b=" + b + ", c=" + c + ", d=" + d);
System.out.printf("a=%d\n", a);
// 输出二进制:使用"Integer.toBinaryString(x)",x为要输出的值
System.out.println("b=" + Integer.toBinaryString(b)); // 暂时记住该代码
// 输出八进制和十六进制:使用"进制转义符 + System.out.printf"(不能使用"System.out.println",会报错)
System.out.printf("c=%o\n", c); // %o为八进制转义符,c表示要输出的值
System.out.printf("d=%x\n", d);
System.out.printf("c=%o,d=%x\n", c, d); // 可以同时使用多个进制转义符,"进制转义符"和"要输出的值"从左至右依次匹配
// System.out.printf("%o,%x", c); // 必须为每个进制转义符都指定一个"要输出的值",否则程序运行时会报错
/*
* 计算机内部都是用补码来存储和表示值的
*/
System.out.println(0b00000000000000000000000000000101);
System.out.println(0b11111111111111111111111111111011);
}
}
二. 位运算符
package b_operator;
public class G_BitOperator {
public static void main(String[] args) {
int a = 5; // 二进制为00000000 00000000 00000000 00000101
int b = 8; // 二进制为00000000 00000000 00000000 00001000
// 与
System.out.println(a & b); // 00000000 00000000 00000000 00000000
// 或
System.out.println(a | b); // 00000000 00000000 00000000 00001101
// 非
System.out.println(~a); // 11111111 11111111 11111111 11111010
System.out.println(~a + 1); // -5的补码
// 异或
System.out.println(a ^ b); // 00000000 00000000 00000000 00001101
// 左移
System.out.println(a << 2); // 00000000 00000000 00000000 00010100
// 右移
System.out.println(a >> 2); // 00000000 00000000 00000000 00000001
System.out.println(-a >> 2); // 11000000 00000000 00000000 00000001
// 无符号右移
System.out.println(-a >>> 2); // 00000000 00000000 00000000 00000001
// 位运算是非短路运算
int i = 1;
boolean bool = false & (i = 2) == 5 & true; // 左边虽然为false,但还是会继续执行右边的代码
System.out.println(i);
System.out.println(bool);
}
}
三. 位运算符和逻辑运算符的区别
逻辑运算符:
- 逻辑运算符针对布尔值进行运算。
- 短路运算。
位运算符:
- 位运算符是针对二进制的位进行运算。
- 非短路运算。