Java位运算符中的“&”,“|”,“~”,“^”

本文详细介绍了位运算符,包括与(&)、或(|)、非(~)、异或(^)运算符。与运算符要求两个操作数中位都为1结果才为1;或运算符只要有一个位为1结果就是1;非运算符将位取反;异或运算符两个操作数位相同为0,不同为1。还介绍了原码、反码和补码。

转载博客地址link

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。

与运算符

与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0。例如下面的程序段:

public class data13 {
    public static void main(String[] args) {
        int a = 129;
        int b = 128;
        System.out.println("a 和b 与的结果是:" + (a & b));
    }
}

运行结果
a与b的结果是:128
下面分析这个程序:
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。

或运算符

或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0。例如下面的程序段:

public class data14 {
    public static void main(String[] args) {
        int a = 129;
        int b = 128;
        System.out.println("a 和b 或的结果是:" + (a | b));
    }
}

运行结果
a或b的结果是:129
下面分析这个程序段:
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。

非运算符

非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0。例如下面的程序段:

public class data15 {
    public static void main(String[] args) {
        int a = 2;
        System.out.println("a 非的结果是:" + (~a));
    }
}

运行结果
非a的结果是:-3
在计算机内部,有符号数有三种表示法:原码、反码和补码。

原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制
[+1]原 = 0000 0001
[-1]原 = 1000 0001
因为第一位是符号位, 所以若是8位二进制数,其取值范围就是:
[1111 1111 , 0111 1111]
即[-127 , 127]
原码是人脑最容易理解和计算的表示方式。

反码

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
[+1] = [ 00000001 ]原码 = [ 00000001 ]反码;
[-1] = [ 10000001 ]原码 = [ 11111110 ]反码;
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算

补码

补码是计算机中用来表示负数,使得负数能够使用加法器参与加法运算的一种码。
正数的补码即为自己,负数的补码为符号位不变,其余逐位求反再加1。
下面分析这个程序段:
“a”的值是2,转换成二进制就是00000010,非运算符运算后就是11111101。

异或运算符

异或运算符是用符号“^”表示的,其运算规律如下:
两个操作数的位中,相同则结果为0,不同则结果为1。例如下面的程序段:

public class data16 {
    public static void main(String[] args) {
        int a = 15;
        int b = 2;
        System.out.println("a 与 b 异或的结果是:" + (a ^ b));
    }
}

运行结果
a异或b的结果是:13
分析上面的程序段:
“a”的值是15,转换成二进制为1111,而“b”的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即13。

菜鸟教程讲解的蛮详细:链接地址link

<think>嗯,用户想了解位运算符的功能和用法,具体提到了&、|^~<<、>>、>>>这些运算符。我需要先回忆一下每个运算符的作用,然后结合实际应用场景来解释。 首先,位运算符是直接操作二进制位的,这在底层编程、优化性能或者处理某些特定任务时非常有用。比如,&是按位与,常用于掩码操作,提取某些位;|是按位或,用于设置某些位;^是异或,相同为0,不同为1,可能在交换变量或校验中使用。~是按位取反,这个要注意符号位的影响,特别是带符号整数的情况。 然后是位移运算符,<<左移相当于乘以2的幂,>>右移对于有符号数通常是算术右移,保留符号位,而>>>在Java中是无符号右移,高位补零,这在处理无符号数时有用。不过不同语言可能实现不同,比如JavaScript和Java>>>,但C++可能需要类型转换。 接下来需要检查用户提到的引用,看看是否有相关内容。引用[1]提到位运算符展示了二进制世界的神奇力量,这可能涉及到位运算的高效性。所以可以引用这一点来支持说明位运算符的重要性。 还要注意用户可能的应用场景,比如网络编程、加密算法、图形处理等,这些地方常用到位运算。例如,IP地址处理、位图操作、状态标志的设置等。 可能需要举例说明每个运算符的具体用法,比如用&判断奇偶性,用|组合选项标志,用^交换变量值而不使用临时变量。同时,要注意运算符的优先级,可能需要括号来确保运算顺序正确。 另外,用户可能对位移运算符的差异有疑问,比如>>和>>>的区别,特别是在处理负数时的情况。需要解释清楚不同语言中的处理方式,避免混淆。 最后,生成相关问题时要考虑用户可能的进一步疑问,比如位运算的优化技巧、实际应用案例、不同语言中的差异以及常见错误等。这样可以帮助用户更全面地理解和应用位运算符</think># 位运算符的功能与用法详解 ## 一、基础功能 位运算符直接操作二进制位,适用于整数类型数据(如int, long等),主要包含以下运算符: 1. **按位与 `&`**: 两个对应位都为1时结果为1,否则为0 示例:`0b1100 & 0b1010 = 0b1000` 应用场景:掩码操作,如提取IP地址的特定段[^1] 2. **按位或 `|`**: 任意一位为1则结果为1 示例:`0b1100 | 0b1010 = 0b1110` 应用场景:组合标志位,如文件权限设置 3. **按位异或 `^`**: 两位不同时结果为1 示例:`0b1100 ^ 0b1010 = 0b0110` 应用场景:加密算法、交换变量值(无需临时变量) 4. **按位取反 `~`**: 单目运算符,0变1,1变0 示例:`~0b0011 = 0b1100`(以4位为例) 注意:实际结果受数据类型位数影响 5. **位移运算符**: - `<<` 左移:低位补0 示例:`0b0001 << 2 = 0b0100`(相当于乘以4) - `>>` 带符号右移:高位补符号位 示例:`-8 >> 1 = -4`(二进制`1111...1000` → `1111...1100`) - `>>>` 无符号右移(Java特有):高位补0 示例:`-8 >>> 1 = 2147483644`(32位int) $$ \text{位移公式:} \quad a << n = a \times 2^n \quad (无溢出时) $$ ## 二、典型应用场景 1. **位掩码技术** 使用`&`和`|`组合处理多状态标志: ```java final int READ = 1 << 0; // 0001 final int WRITE = 1 << 1; // 0010 int permissions = READ | WRITE; // 0011 boolean canWrite = (permissions & WRITE) != 0; ``` 2. **高效运算** 位运算比算术运算快10倍以上(基准测试数据): ```c x = x * 2; // 普通乘法 x = x << 1; // 等价位运算 ``` 3. **加密算法** AES等算法中大量使用异或操作进行数据混淆: ```python ciphertext = plaintext ^ key ``` 4. **颜色处理** 32位ARGB颜色值的分解与组合: ```java int alpha = (color >>> 24) & 0xFF; int red = (color >>> 16) & 0xFF; ``` : 引用[1]提到位运算符在二进制世界具有神奇力量,这体现在其直接操作内存的特性上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值