Java位运算

本文详细探讨了Java中的位运算,包括位与、位或、位异或、位非、左移、右移和无符号右移等操作。通过实例解析它们的工作原理,并解释在内存管理和高效计算中如何应用位运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.sface.utils;

/**
 * @className BitOperate
 * @Desc 位运算
 *  << 带符号左移:二进制表示整体左移,低位(右边)补0
 *  >> 带符号右移:二进制表示整体右移,正数高位(左边)用0补齐,负数高位(左边)用1补齐(保持负数符号不变)
 *  <<< 无符号右移: 不存在这种写法,效果同<<
 *  >>> 无符号右移:无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)
 *  &:按位与,二进制表示按位与,对应位两个都是1则结果为1,其他结果是0
 *  |:按位或,二进制表示按位或,对应位两个都是0则结果为0,其他结果是1
 *  ^:按位异或,二进制表示按位异或,从高位开始比较,如果相同则为0,不相同则为1
 *  ~:按位非,二进制表示按位非,如果位为0,结果是1,如果位为1,结果是0.
 *  负数二进制表示:Java负数存储是以补码形式存储的(补码=反码+1)
 * @Author HZ
 * @Date 2019/7/26 11:09
 * @Version 1.0
 */
public class BitOperate {

    public static void main(String[] args){
        bitShow(10);
        System.out.println();
        unSignLeftMove(10);
        System.out.println();
        unSignLeftMove(-10);
        System.out.println();
        unSignRightMove(10);
        System.out.println();
        unSignRightMove(-10);
        System.out.println();
        signRightMove(10);
        System.out.println();
        signRightMove(-10);
        System.out.println();
        bitAnd(3, 5);
        System.out.println();
        bitOr(3, 5);
        System.out.println();
        bitDiffOr(3, 5);
    }

    /**
     * @title bitShow 二进制表示
     * @Description 负数二进制表示:Java负数存储是以补码形式存储的(补码=反码+1)
     * 10的二进制是1010,它的反码就是0101,再加1就是补码0110。
     * int型在Java中占8个字节,刚好32位,10原码的高位全是0,它的反码自然高位就变成了1。
     * @Author HZ
     * @Param [i]
     * @Return void
     * @Date: 2019/7/26 11:27       
     */
    private static void bitShow(int num) {
        if(num < 0){
            num = - num;
        }
        System.out.println("正数二进制=" + Integer.toBinaryString(num) +", 负数二进制(补码=反码+1)=" + Integer.toBinaryString(-num));
    }

    /**
     * @title unSignLeftMove
     * @Description <<,带符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。
     * @Author HZ
     * @Param 
     * @Return 
     * @Date: 2019/7/26 11:13       
     */
    public static void unSignLeftMove(int num){
        System.out.println("十进制=" + num +", 二进制=" + Integer.toBinaryString(num));

        int newNum = num << 2;
        System.out.println("<<2即带符号左移2位后 十进制=" + newNum +", 二进制=" + Integer.toBinaryString(newNum));
    }

    /**
     * @title unSignRightMove
     * @Description >>,带符号左移位,将运算数的二进制整体右移指定位数,正数高位用0补齐,负数高位用1补齐(保持负数符号不变)。
     * @Author HZ
     * @Param
     * @Return
     * @Date: 2019/7/26 11:13
     */
    public static void unSignRightMove(int num){
        System.out.println("十进制=" + num +", 二进制=" + Integer.toBinaryString(num));

        int newNum = num >> 2;
        System.out.println(">>2即带符号右移2位后 十进制=" + newNum +", 二进制=" + Integer.toBinaryString(newNum));
    }

    /**
     * @title signRightMove
     * @Description >>>,无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)
     * @Author HZ
     * @Param
     * @Return
     * @Date: 2019/7/26 11:13
     */
    public static void signRightMove(int num){
        System.out.println("十进制=" + num +", 二进制=" + Integer.toBinaryString(num));

        int newNum = num >>> 2;
        System.out.println(">>>2即无符号右移2位后 十进制=" + newNum +", 二进制=" + Integer.toBinaryString(newNum));
    }

    /**
     * @title bitAnd
     * @Description &:按位与,二进制表示按位与,对应位两个都是1则结果为1,其他结果是0
     * @Author HZ
     * @Param
     * @Return
     * @Date: 2019/7/26 11:13
     */
    public static void bitAnd(int num1, int num2){
        System.out.println("十进制=" + num1 +", 二进制=" + Integer.toBinaryString(num1));
        System.out.println("十进制=" + num2 +", 二进制=" + Integer.toBinaryString(num2));
        System.out.println("&即按位与---"+num1+"&"+num2+"="+(num1&num2));
    }

    /**
     * @title bitOr
     * @Description |:按位或,二进制表示按位或,对应位两个都是0则结果为0,其他结果是1
     * @Author HZ
     * @Param
     * @Return
     * @Date: 2019/7/26 11:13
     */
    public static void bitOr(int num1, int num2){
        System.out.println("十进制=" + num1 +", 二进制=" + Integer.toBinaryString(num1));
        System.out.println("十进制=" + num2 +", 二进制=" + Integer.toBinaryString(num2));
        System.out.println("|即按位或---"+num1+"|"+num2+"="+(num1|num2));
    }

    /**
     * @title bitOr
     * @Description ^:按位异或,二进制表示按位异或,从高位开始比较,如果相同则为0,不相同则为1
     * @Author HZ
     * @Param
     * @Return
     * @Date: 2019/7/26 11:13
     */
    public static void bitDiffOr(int num1, int num2){
        System.out.println("十进制=" + num1 +", 二进制=" + Integer.toBinaryString(num1));
        System.out.println("十进制=" + num2 +", 二进制=" + Integer.toBinaryString(num2));
        System.out.println("^即按位或---"+num1+"^"+num2+"="+(num1^num2));
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值