java二进制位运算

一、与、或、异或、取反

Java位运算符是对操作数的二进制位进行运算,操作数和计算结果都是整型,位运算符如下:
在这里插入图片描述
&与:

两个二进制位只要有一个为0那么结果就为0,否则结果为1。

|或:

两个二进制位只要有一个为1那么结果就为1,否则结果为0。

^异或:

任何相同二进制位进行 ^ 运算,结果是0;不相同二进制位 ^ 运算结果是1。

~取反:

0变1,1变0

记的时候可以把1当作true,0当作flase

/**
 * @Auther: allone_SilenceTXB
 * @Date: 2022/1/15
 * @Description:
 */
public class OperatorDemo1 {

    public static void main(String[] args) {
        /*与、或、异或、取反*/

        //与 只要有0就是0 否则为1
        System.out.println(3 & 4); //0 
        
        //或 只要有1就是1 否则为0
        System.out.println(3 | 4); //7
        
        //异或 相同为0 不同为1
        System.out.println(3 ^ 4); //7
        
        //取反 0变1 1变0(结果为补码要转成原码)
        System.out.println(~3); //-4
    }

}

二、左移、右移、无符号右移

1、左移

语法如下:

操作数<<位数

将符号左边的操作数左移指定的位数。

首先将左边的操作数转为二进制。

然后按照要求左移指定位数,左边最高位丢弃,右边补齐0。

比如:

3<<2
3的二进制:
00000000 00000000 00000000 00000011
左移2位,左边最高位丢弃,右边补齐000000000 00000000 00000000 00001100

2、右移

语法如下:

操作数>>位数 

将符号左边的操作数右移指定的位数。

首先将左边的操作数转为二进制。

然后按照要求右移指定位数,最高位是0,左边补齐0;最高为是1,左边补齐1。

比如:

24>>2
24的二进制:
00000000 00000000 00000000 00011000
右移2位,最高位是0,左边补齐0;最高为是1,左边补齐100000000 00000000 00000000 00000110

3、无符号数右移

语法如下:

操作数>>>拉数

将符号左边的操作数右移指定的位数。

首先将左边的操作数转为二进制。

然后按照要求右移指定位数,无论最高位是0还是1左边补齐0。

运行下边的程序:

//<< 左移1位即左边数乘以2的1次方,左移2位即左边数乘以2的2次方,以此类推
		System.out.println(3 << 2); 
	
		//>> 右移1位即左边数除以2的1次方,右移2位即左边数除以2的2次方,以此类推
		System.out.println(24 >> 2); 
		//负数转成二进制要用补码,最终将补码右移,再转成原码
		System.out.println(-24 >> 2); 
		//无符号数右移无论最高位是0还是1左边都补齐0
		System.out.println(24 >>> 2);
		System.out.println(-24 >>> 2);

三、奇偶判断

位运算是直接操作二进制位,效率较高,一些算法会采用位运算。

奇偶判断是判断一个是奇数还是偶数,如何使用位运算实现呢?

使用与(&)运算可以实现,根据与运算的特点,两个二进制位只要有一个为0那么结果就为0,否则结果为1。

二进制的最低位为1一定是奇数,为0则一定是偶数,我们让该数和1进行与运算,结果为1则是奇数,为0则是偶数。

程序如下:

		int a = 1;
		int x = 6;
		int y = 7;
		//和1与运算,结果为1则为奇数
		System.out.println(x & a);
		//和1与运算,结果为0则为偶数
		System.out.println(y & a);

四、两数交换

 /**
     * 位运算实现两数交换 效率高 直接操作内存
     */
    private static void swap3() {
        int m = 5;
        int n = 10;

        m = m ^ n;
        n = m ^ n; //此时 n = m ^ n ^ n

        m = m ^ n; //此时 m = m ^ n ^ m

        System.out.println(m); //10
        System.out.println(n); //5
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算二进制中的减法,需要借位才能得出正确结果。例如,当减去2的二进制数110时,可以先将减数变为其补码,即0010,然后再将被减数和减数进行加法运算,得到1101。最后将得到的结果转换为十进制格式即可,即13。因此,答案为13。 ### 回答2: Java中的二进制位运算是通过位运算符来实现的。Java中的位运算符包括位与(&)、位或(|)、位异或(^)、取反(~)、左移(<<)和右移(>>)。 位与运算符(&)是指将两个操作数的每个二进制位进行“与”运算,只有当两个二进制位都为1时,结果为1。例如:1101 & 1011 = 1001。 位或运算符(|)是指将两个操作数的每个二进制位进行“或”运算,只要两个二进制位有一个为1,结果为1。例如:1101 | 1011 = 1111。 位异或运算符(^)是指将两个操作数的每个二进制位进行“异或”运算,也就是只有两个二进制位不相同时,结果为1。例如:1101 ^ 1011 = 0110。 取反运算符(~)是指将操作数的每个二进制位取反,也就是1变成0,0变成1。例如:~1101 = 0010。 左移运算符(<<)是指将操作数的每个二进制位向左移动指定的位数,左边超出部分被丢弃,右边空出来的部分用0填充。例如:1011 << 2 = 110100。 右移运算符(>>)是指将操作数的每个二进制位向右移动指定的位数,右边超出部分被丢弃,左边空出来的部分用原来的最高位填充。例如:1101 >> 2 = 0011。 Java中的二进制位运算可以用于位掩码、数据压缩和加密解密等方面。在实际编程中,需根据实际需求选择合适的位运算符进行操作。需要注意的是,Java中的位运算符优先级比较低,要加括号使其优先级变高。 ### 回答3: Java中的二进制位运算是指通过位级别上的操作来处理二进制数的运算。Java中支持六种位运算操作符:与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)以及无符号右移(>>>)。 &(与运算符):当两个二进制数的同一位都为1时,结果为1;否则为0。 |(或运算符):当两个二进制数的同一位都为0时,结果为0,否则为1。 ^(异或运算符):当两个二进制数的同一位值不同时,结果为1,否则为0。 ~(取反运算符):将二进制数的每一位取反,即0变为1,1变为0。 <<(左移运算符):将二进制数向左移动指定的位数,左移后右边会补0,左边的最高位被抛弃。 >>(右移运算符):将二进制数向右移动指定的位数,右移后左边会补上原最高位的值(有符号右移),即如果最高位是1,右移后左边会补1;如果最高位是0,右移后左边会补0。 >>>(无符号右移运算符):无论最高位是0还是1,都将其替换为0,然后进行右移操作。 二进制位运算在实际应用中用途广泛,比如位运算可以用来压缩数据,以达到节省空间的目的。另外,位运算还可以用来进行加密和解密等处理。 总的来说,掌握Java中的二进制位运算对于程序员来说是非常重要的,可以帮助开发高效的代码和优化性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值