java运算符

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 0110

    3135158 ^ 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 0110

    3135158 | 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值