位运算符主要用于对操作数的二进制位进行运算。位运算表示对每个二进制位(bit)进行计算,其中操作数和运算结果都是整数值。
Java语言中的位运算符分为两类:位逻辑运算符和移位运算符,下面对每一类运算符进行详细介绍。
按位逻辑运算符
有 4 位逻辑运算符:&(与)、|(或)、~(非)和 ^(异或)。除~(按位求反)为一元运算符外,其余均为二元运算符。它们的基本用法如表1所示。
| 操作员 | 意义 | 例子 | 结果 |
|---|---|---|---|
| & | 按位与运算 (AND) | 4&5 | 4 |
| | | 按位逻辑和运算 (OR) | 4 | 5 | 5 |
| ^ | 按位异或 (XOR) | 4^5 | 1 |
| ~ | 按位取反运算 (NOT) | ~4 | -5 |
按位与运算符
按位与运算符为& ,其运算规则为:对参与运算的数字进行低位排列,高位用 0 填充,如果对应的二进制位同时为 1,则运算结果为 1 ,否则 0 如果 .因此,任何数字与 0 按位与的结果都是 0。
例如,这样的表达式:
100&0 结果是0。
下面是对两个非零数进行按位与运算的过程。
int x = 5, y = 12; // 2つの数を保存する整数変数を作成する
int z = x & y; // これら2つの数にビットAND演算を行い、その結果をzに保存する 执行这两行语句后,变量 Z 的值为 4。
按位或运算符
按位或运算符是| ,其运算规则是从最低值开始对齐参与运算的数字,如果没有足够的高值,则用零填充。如果对应的二进制位只有一位为 1,则结果为 1。如果对应的二进制位全为0,则结果为0。
下面是使用按位 OR 运算符的表达式。
11|7 结果是15
按位异或运算符
按位异或运算符为^ ,其运算规则如下:参与运算的数字从下往上排列,上边不够的补零。如果对应的二进制位相同(同时为 0 或 1),则结果为 0;如果对应的二进制位不同,则结果为 1。
下面是使用按位 XOR 运算符的表达式。
11^7 提示:一些高级语言使用运算符^作为幂运算符,因此您应该注意这种区别。
按位求反运算符
位反转运算符为~ ,其运算规则是只对一个操作数进行操作,将操作数的二进制 1 变为 0,将 0 变为 1。
下面是使用按位否定运算符的表达式。
~10 计算结果为65525。
您可以使用以下程序检查此操作的结果。
int i = 10;
System.out.printf("%d \n",〜i); 当你编译并运行上面的程序时,你会注意到输出是-11而不是65525。这是因为求反后的结果是十六进制,而上面的程序使用%d将输出转换为十进制。
您可以使用以下语句显示十六进制结果:
int i=10;
System.out.printf("%x \n",~i);
//変数iに値10を代入します。
System.out.printf(「%x \ n」、〜i);: iのビット反転値の16進数表記を出力します。 可以看到输出结果为fff5。转换为二进制后,变为1111111111110101。该二进制数的最高位为1,表示该数为负数。最高位加1并按位取反,得到原始二进制码1000000000001011(十进制为-11)。
注意:按位运算符的操作数只能包含整数或字符数据及其变体。不允许使用 float、double 和 long 等复杂类型。
移位操作符
移位运算符用于将操作数沿特定方向(左或右)移动指定数量的二进制数字。表2列出了Java语言中的两个位移运算符。这些都是双目操作员。
| 操作员 | 意义 | 例子 | 结果 |
|---|---|---|---|
| » | 右移运算符 | 8»1 | 4 |
| « | 左移运算符 | 9«2 | 36 |
左移运算符
左移运算符为« ,其运算规则为:将所有数字向左移动相应的二进制位数,删除(丢弃)高位,并用零填充低位中的空位。
原数的所有二进制位都左移一位。原来位于左侧的最高有效位 0 被移出并丢弃,并在末尾添加 0 以形成该位。最终结果是22,是原来数字的两倍。
右移运算符
右移运算符为» ,其运算规则为:将所有数字以二进制格式右移相应位数,删除(丢弃)低位,并用零填充高位。
原数的所有二进制位均右移一位。原来位于右侧的最低有效位 (1) 被移出并丢弃,并在最高有效位上添加零 (0) 以进行补偿。最终结果是5,相当于原数除以2。

所有二进制按位运算符都有一种结合了赋值和按位运算的简写形式。复合按位赋值运算符由一个赋值运算符与一个按位逻辑运算符和一个移位运算符组合而成。表 3 显示了复合位赋值运算符的组合。
| 操作员 | 意义 | 例子 | 结果 |
|---|---|---|---|
| &= | 按位和赋值 | 数字 1 &= 数字 2 | 相当于num 1=num 1 & num2 |
| |= | 按位或赋值 | 数字 1 |= 数字 2 | 相当于 num 1=num 1 | num2 |
| ^= | 按位异或赋值 | 数字 1 ^= 数字 2 | 相当于 num 1=num 1 ^ 2号 |
| -= | 按位逆赋值 | 数字 1 -= 数字 2 | num 1=num 1 – 相当于 num2 |
| «= | 按位左移赋值 | 数字 1 «= 数字 2 | num 1=num 1 « 相当于 num2 |
| »= | 按位右移赋值 | 数字 1 »= 数字 2 | 相当于 num 1=num 1 » num2 |
下面的程序定义了几个int变量,并使用位赋值的简写将计算出的值赋给相应的变量。
int a = 1;
int b = 2;
int c = 3;
a &= 4;
a |= 4;
a ^= c;
a -= 6;
b >>= 1;
c <<= 1;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c); 该程序的输出是:
a = 1
b = 1
c = 6




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

