java运算符
-
十进制转二进制
给定一个数循环除以2,直到商为0或1,取每一步的余数并将余数顺序颠倒,则得到这个数的二进制数。
已8为例:
第一次:8/2=4(余0)
第二次:4/2=2(余0)
第三次:2/2=1(余0)
第四次:1/2=0.5(不足1的补为1)
得出每次的余为“0001”,再将顺序颠倒则得到二进制数位“1000”
计算机内部存储最小单位为 bit(位),1字节=8位,1位则存放一个0或1的二进制数,“1000” 还不足一字节因此高位补“0”得到“00001000”
public static void main(String[] args) { int num = 8; String binary = intBinary(num); System.out.println(num + "的二进制为:" + binary); while (binary.length() % 8 != 0) { binary = "0" + binary; } System.out.println("高位补0后为:" + binary); } public static String intBinary(int num) { String binary = ""; while (num != 0) { binary = num % 2 + binary; num = num / 2; } return binary; }
运行结果: 8的二进制为:1000 高位补0后为:00001000
-
二进制转10进制
8的8位二进制位“00001000”,去掉高位补的“0”为“1000”,从“1000”的个位开始计算((2的N次幂【个位数N=0,十位数N=1…以此类推】)乘以对应位数的值)并将每一位计算的结果相加
公式:(2的0次幂)* 0 + (2的1次幂)* 0 + (2的2次幂)* 0 + (2的3次幂)* 1 =8;
public static void main(String[] args) { System.out.println("未高位补“0”:" + binaryToDecimal("1000")); System.out.println("高位补“0”:" + binaryToDecimal("00001000")); } public static int binaryToDecimal(String binary) { int num = 0; String[] array = binary.split(""); for (int i = array.length - 1, j = 0; i >= 0; i--, j++) { num += Math.pow(2, j) * Integer.valueOf(array[i]); } return num; }
运行结果: 未高位补“0”:8 高位补“0”:8
-
位异或运算(^)
运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。(两个二进制数长度必须相等,短的一方高位补“0”对齐)
例:3135158 ^ 3680
3135158 的二进制为 1011111101011010110110
3680 的二进制为 111001100000
111001100000 比 1011111101011010110110 长度要短,则 111001100000 高位补0 与1011111101011010110110 对齐
补0后得到:
3135158 的二进制为 10 1111 1101 0110 1011 0110
3680 的二进制为 00 0000 0000 1110 0110 0000
3135158 ^ 3680 的二进制为 10 1111 1101 1000 1101 01103135158 ^ 3680 = 3135702
-
位与运算符(&)
运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。(两个二进制数长度必须相等,短的一方高位补“0”对齐)例:3135158 & 3680
3135158 的二进制为 1011111101011010110110
3680 的二进制为 111001100000
111001100000 比 1011111101011010110110 长度要短,则 111001100000 高位补0 与1011111101011010110110 对齐
补0后得到:
3135158 的二进制为 10 1111 1101 0110 1011 0110
3680 的二进制为 00 0000 0000 1110 0110 0000
3135158 & 3680 的二进制为 00 0000 0000 0110 0010 0000 高位未补0为:11000100000
3135158 & 3680 = 1568 -
位或运算符(|)
运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。(两个二进制数长度必须相等,短的一方高位补“0”对齐)
例:3135158 | 3680
3135158 的二进制为 1011111101011010110110
3680 的二进制为 111001100000
111001100000 比 1011111101011010110110 长度要短,则 111001100000 高位补0 与1011111101011010110110 对齐
补0后得到:
3135158 的二进制为 10 1111 1101 0110 1011 0110
3680 的二进制为 00 0000 0000 1110 0110 0000
3135158 | 3680 的二进制为 10 1111 1101 1110 1111 01103135158 | 3680= 3137270
-
位非运算符(~)
运算规则:如果位为0,结果是1,如果位为1,结果是0
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的占四个字节,1字节= 8bit ,也就是int数据类型一共有32bit
例:~ 3680
3680 的二进制位为: 111001100000
补码后:0000 0000 0000 0000 0000 1110 0110 0000
取反为:1111 1111 1111 1111 1111 0001 1001 1111~ 3680 = -3681
-
左移运算符(<<)num << 1,相当于num乘以2
运算规则:将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)
值为正数:
例:3680 << 1
3680 的二进制为 :1110 0110 0000
向左位移1位后: 1 1100 1100 0000
3680 << 1 = 7360
值为负数:
例:-3680 << 1
-3680 的二进制为 :1111 1111 1111 1111 1111 0001 1010 0000
向左位移1位后: 1111 1111 1111 1111 1110 0011 0100 0000
-3680 << 1 = -7360
-
"有符号"右移运算符(>>) num >> 1,相当于num除以2
运算规则:将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1
值为正数:
例:3680 >> 1
3680 的二进制为 : 1110 0110 0000
向右"有符号"移1位后: 111 0011 0000
向右"有符号"移1位补码后: 0111 0011 0000
3680 >> 1 = 1840
值为负数:
例:-3680 >> 1
-3680 的二进制为 : 1111 1111 1111 1111 1111 0001 1010 0000
向右"有符号"移1位后: 1111 1111 1111 1111 1111 1000 1101 0000
-3680 >> 1 = -1840
-
"无符号"右移运算符(>>>)忽略符号位,空位都以0补齐
运算规则:将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0
值为正数:
例:3680 >>> 1
3680 的二进制为 : 1110 0110 0000
向右"无符号"移1位后: 111 0011 0000
向右"无符号"移1位补码后: 0111 0011 0000
3680 >>> 1 = 1840
值为负数:
例:-3680 >>> 1
-3680 的二进制为 : 1111 1111 1111 1111 1111 0001 1010 0000
向右"无符号"移1位后: 111 1111 1111 1111 1111 1000 1101 0000
向右"无符号"移1位补码后: 0111 1111 1111 1111 1111 1000 1101 0000
-3680 >>> 1 = 2147481808