java 与(&)、或(|)、异或(^)、按位取反(~)、左移(<<)、右移(>>)

以一个字节 8位做演算

a的2进制 00011100

b的2进制:00110111

int a = 28;
int b = 55;

a: 00011100

b: 00110111

一、按位与(&)运算 全1为1  见0为0 

a:         00011100

b:         00110111

a&b:    00010100

二、按位或(|)运算  见1为1 全0为0

a:         00011100

b:         00110111

a|b:      00111111

三、异或(^)  不同为0 相同为1

a:         00011100

b:         00110111

a^b:     00101011

 四、左移(<<)   

左移 n 位

二进制左移 n位

相当于10进制乘2的n次方

a:         00011100

b:         00110111

a<<3:   11100000 

10进制值:224 扩大 8倍

五、右移(>>)

右移 n 位

二进制右 n位

相当于10进制除2的n次方(每次除了之后若有小数都是取整数部分)

a:         00011100

b:         00110111

a>>3:   00000011 

//十进制得法

28/2 = 14

14/2 = 7

7/2 = 3.5 但由于java整数类型 所以  7/2实际上 = 3 所以

10进制值:3 缩小 8倍

 六、按位取反(~)

a:         00011100

~a:       11100011

 七、上java代码

package groundFloor;

/**  按位与运算、或运算、异或运算、转32位
 * @author codelmh
 * @data 2021/12/5
 */
public class Operation {
    public static void main(String[] args) {
        int a = 28;
        int b = 55;
        System.out.println("========原32位值==========");
        print(a);
        print(b);
        /*
            按位与运算  &
            全1为1 见0为0
        */
        System.out.println("========按位 与 & 后的值==========");
        print( a & b);
        /*
            按位或运算 |
            见1为1 全0为0
        */
        System.out.println("========按位 与 | 后的值==========");
        print( a | b);
        /*
            左移 n 位
            二进制左移 n位
            相当于10进制乘2的n次方
        */
        System.out.println("========左移3位 后的值==========");
        print( a << 3);
        System.out.println(a << 3 );
        print( b << 3);
        System.out.println(b << 3);
        /*
            右移 n 位
            二进制右 n位
            >> 带符号右移
            >>> 不带符号右移
        */
        System.out.println("========右3位 后的值==========");
        print( a >> 3);
        System.out.println(a >> 3 );
        print( b >> 3);
        System.out.println(b >> 3 );

        /*
            异或运算 ^
            不同为0 相同为1
        */
        System.out.println("========异或^ 后的值==========");
        print( a ^ b);
        /*
            按位取反
            1位0 0为1
        */
        System.out.println("========按位取反 后的值==========");
        print( ~a);

    }

    /**
     * 10进制转32位方法
     * @param num 数值
     */
    public static void print(Integer num){
        for(int i = 31; i >= 0; i--) {
            /*
                ( 1 << i ) 1 向左移 i 位
                ( num & (...)  按位 & 与运算 全1为1 见0为0
                ( boolean) ? "0" : "1"  三目运算
                boolean = true 则  = 0  boolean = false 则 = 1
             */
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
            if ( i % 8 == 0){
                // 每8位 一个字节 + 空格
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

若是要得到一个数的相反数我们可以

        //第一种
        System.out.println(-a);
        //第二种
        System.out.println(~a+1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值