Java支持的位运算符

Java支持的位运算符

  • &:按位与,只有两个操作数对应位同为1时,结果为1,其余全为0。(或者是只要有一个操作数为0,结果就为0),通过n&1 == 1是否成立可以判断一个数n的奇偶性,若成立,则为奇数,否则为偶数。
  • |:按位或,只有两个操作数对应位同为0时,结果为0,其余全为1。(或者是只要有一个操作数为1,结果就为1)。
  • ~:按位非,对应位取反即可。
  • ^:按位异或,对应位不同为1,相同则为0。
    • 任何数异或本身结果为0。
    • a ^ b=b ^ a,异或是一个无顺序的运算符,则b ^ a ^ b=b ^ b ^ a,结果为0^a。
  • <<:左移一位,相当于×2,m<<n相当于m*2^n
  • >>:右移一位,相当于÷2
  • >>>:无符号右移运算符,低位溢出,高位补0。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-1>>>1结果为2147483647。

上述位运算符中 ,除 以 外 ,其余均为二元运算符 。 操作数只能为整型和字符型数据。

长见识:

1. 通过位运算取绝对值原文链接

(a^(a>>31))-(a>>31)

先整理一下使用位运算取绝对值的思路:若a为正数,则不变,需要用异或0保持的特点;若a为负数,则其补码为源码翻转每一位后+1,先求其源码,补码-1后再翻转每一位,此时需要使用异或1具有翻转的特点。

任何正数右移31后只剩符号位0,最终结果为0,任何负数右移31后也只剩符号位1,溢出的31位截断,空出的31位补符号位1,最终结果为-1.右移31操作可以取得任何整数的符号位。

那么综合上面的步骤,可得到公式。a>>31取得a的符号,若a为正数,a>>31等于0,a^0=a,不变;若a为负数,a>>31等于-1 ,a^-1翻转每一位.

2. 通过位运算实现两个元素的交换

在这里插入图片描述

### Java 中的位运算符及其用法 Java 提供了一组专门用于处理整数类型二进制位的操作符,称为 **位运算符**。这些运算符可以直接作用于操作数的每一位,从而实现按位计算[^1]。 #### 常见的位运算符 以下是 Java 支持的主要位运算符: | 符号 | 名称 | 描述 | |------|------------|----------------------------------------------------------------------| | `&amp;` | 按位与 (AND) | 对两个操作数逐位执行逻辑与操作,只有当两位都为 1 时结果才为 1。 | | `\|` | 按位或 (OR) | 对两个操作数逐位执行逻辑或操作,只要有一位为 1 结果就为 1。 | | `^` | 按位异或 (XOR) | 对两个操作数逐位执行逻辑异或操作,仅当两对应位不同时结果为 1。 | | `~` | 按位取反 (NOT) | 将操作数的每一位取反,即把 0 变成 1,把 1 变成 0。 | 此外还有移位运算符(如左移 `&lt;&lt;&lt;` 和右移 `&gt;&gt;&gt;`),但这里主要讨论上述四种基本位运算符[^3]。 --- #### 示例代码展示 下面通过具体的例子来说明每种位运算符的功能和使用方法。 ```java public class BitwiseOperatorExample { public static void main(String[] args) { int a = 6; // 二进制形式: 0110 int b = 9; // 二进制形式: 1001 // 按位与 (&amp;) System.out.println(&quot;a &amp; b = &quot; + (a &amp; b)); // 输出: 0, 即 0110 &amp; 1001 -&gt; 0000 // 按位或 (\|) System.out.println(&quot;a \| b = &quot; + (a \| b)); // 输出: 15, 即 0110 \| 1001 -&gt; 1111 // 按位异或 (^) System.out.println(&quot;a ^ b = &quot; + (a ^ b)); // 输出: 15, 即 0110 ^ 1001 -&gt; 1111 // 按位取反 (~) System.out.println(&quot;~a = &quot; + ~a); // 输出: -7, 即 ~(0110) -&gt; -(0111), 补码表示负数 } } ``` --- #### 解析 - **按位与 (`&amp;`)** 当两个对应的二进制位均为 1 时,结果才是 1;否则为 0。例如,在上面的例子中,`a=6(0110)` 和 `b=9(1001)` 的按位与结果为 `0000`,因此输出为 `0`。 - **按位或 (`\|`)** 如果任意一位为 1,则结果为 1;如果两者皆为 0 则结果为 0。对于同样的输入值,`a=6(0110)` 和 `b=9(1001)` 的按位或结果为 `1111`,所以输出为十进制下的 `15`[^2]。 - **按位异或 (`^`)** 若两个相对应的二进制位不同则该位置上结果为 1,相同则为 0。基于此原则,`a=6(0110)` 和 `b=9(1001)` 经过按位异或后的结果也是 `1111` 或者说是十进制数值上的 `15`。 - **按位取反 (`~`)** 此操作会翻转每一个比特位的状态&mdash;&mdash;即将所有的 0 转变为 1 并且反之亦然。由于计算机内部采用补码存储负数的方式,故而 `-7` 是最终显示出来的结果。 --- ### 总结 以上就是关于 Java 中几种常见位运算符的具体解释以及实际应用案例演示。利用好这些工具可以帮助开发者更高效地完成某些特定场景下程序设计工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值