Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
1、左移( << )
Test1、将5左移2位:
[java]
package com.xcy;
public class Test {
public static void main(String[] args) {
System.out.println(5<<2);//运行结果是20
}
}
运行结果是20,但是程序是怎样执行的呢?
首先会将5转为2进制表示形式(java中,整数默认就是int类型,也就是32位):
0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:
0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
2、右移( >> ) ,右移同理,只是方向不一样罢了(感觉和没说一样)
[java]
System.out.println(5>>2);//运行结果是1
还是先将5转为2进制表示形式:
0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
0000 0000 0000 0000 0000 0000 0000 0001
3、无符号右移( >>> )
我们知道在Java中int类型占32位,可以表示一个正数,也可以表示一个负数。正数换算成二进制后的最高位为0,负数的二进制最高为为1
例如 -5换算成二进制后为:
1111 1111 1111 1111 1111 1111 1111 1011 (刚开始接触二进制时,不知道最高位是用来表示正负之分的,当时就总想不通。。明明算起来得到的就是一个正数-_-)
我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
[java]
package com.xcy;
public class Test {
public static void main(String[] args) {
System.out.println(5>>3);//结果是0
System.out.println(-5>>3);//结果是-1
System.out.println(-5>>>3);//结果是536870911
}
}
我们来看看它的移位过程(可以通过其结果换算成二进制进行对比):
5换算成二进制: 0000 0000 0000 0000 0000 0000 0000 0101
5右移3位后结果为0,0的二进制为: 0000 0000 0000 0000 0000 0000 0000 0000 // (用0进行补位)
-5换算成二进制: 1111 1111 1111 1111 1111 1111 1111 1011
-5右移3位后结果为-1,-1的二进制为:
1111 1111 1111 1111 1111 1111 1111 1111 // (用1进行补位)
-5无符号右移3位后的结果 536870911 换算成二进制:
0001 1111 1111 1111 1111 1111 1111 1111 // (用0进行补位)
通过其结果转换成二进制后,我们可以发现,正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)
注意:笔者在这里说的是右移,高位补位的情况。正数或者负数左移,低位都是用0补。(自行测试)
4、位与( & )
[java]
package com.xcy;
public class Test {
public static void main(String[] args) {
System.out.println(5 & 3);//结果为1
}
}
还是老套路,将2个操作数和结果都转换为二进制进行比较:
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
-------------------------------------------------------------------------------------
1转换为二进制:0000 0000 0000 0000 0000 0000 0000 0001
位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
5、位或( | )
[java]
package com.xcy;
public class Test {
public static void main(String[] args) {
System.out.println(5 | 3);//结果为7
}
}
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
-------------------------------------------------------------------------------------
7转换为二进制:0000 0000 0000 0000 0000 0000 0000 0111
位或操作:第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
6、位异或( ^ )
[java]
package com.xcy;
public class Test {
public static void main(String[] args) {
System.out.println(5 ^ 3);//结果为6
}
}
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
-------------------------------------------------------------------------------------
6转换为二进制:0000 0000 0000 0000 0000 0000 0000 0110
位异或:第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
7、位非( ~ ) 位非是一元操作符
[java]
package com.xcy;
public class Test {
public static void main(String[] args) {
System.out.println(~5);//结果为-6
}
}
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
-------------------------------------------------------------------------------------
-6转换为二进制:1111 1111 1111 1111 1111 1111 1111 1010
位非:操作数的第n位为1,那么结果的第n位为0,反之。
由位运算操作符衍生而来的有:
&= 按位与赋值
|= 按位或赋值
^= 按位非赋值
>>= 右移赋值
>>>= 无符号右移赋值
<<= 赋值左移
和 += 一个概念而已。
举个例子:
[java] www.2cto.com
package com.xcy;
public class Test {
public static void main(String[] args) {
int a = 5
a &= 3;
System.out.println(a);//结果是1
}
}
相关推荐
位或运算符“|”只要有一个操作数在相应位上是1,结果位就为1,42(00101010)与15(00001111)按位或得到47(00101111)。 **按位异或(XOR)**: 位异或运算符“^”只有当两个操作数在相应位上的值不同时结果才为...
位运算包括移位(左移、右移、无符号右移)、位与(&)、位或(|)、位异或(^)以及位非(~)。这些运算符在处理二进制数据、优化计算效率以及进行位级逻辑操作时非常有用。下面我们将详细解释这些运算符的工作原理...
- **按位或(|)**:如果两个相应位中有任意一位为1,则结果位为1;否则为0。 - **按位异或(^)**:如果两个相应位不同,则结果位为1;否则为0。 - **按位取反(~)**:将每个位取反,即0变1,1变0。 - **左移位...
- **按位或 (`|`)**:对两个二进制数进行按位或操作,只要有一个相应位为1,结果就为1。 - 示例:`5 | 3 = 7` - `5` 的二进制表示为 `00000000000000000000000000000101`,`3` 的二进制表示为 `...
首先,位运算的基本操作包括按位与(&)、按位或(|)、按位异或(^)和按位取反(~)。按位与运算符(&)对两个数的每一位进行比较,只有当两个相应的位都为1时结果位才为1,否则为0。按位或运算符(|)则是只要两个相应的位有...
Java 位运算是编程语言中的一种底层操作,它允许我们直接对整数类型的数据进行按位操作,包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()、右移(>>)和无符号右移>>>。这些操作在处理二进制数据、优化...
- `|`:按位或,两个位中至少有一个为1时结果为1。 - `^`:按位异或,两个位相同为0,不同为1。 - **移位运算符**: - `左移位运算,向左移动指定位数,高位补0。 - `>>`:有符号右移位,向右移动指定位数,...
- **循环移位**:通过异或运算,可以实现数据的循环左移(A << n XOR A >> (bit_count-n))和循环右移(A >> n XOR A (bit_count-n))。 - **错误检测**:CRC(Cyclic Redundancy Check)校验码就是基于异或运算,...
- **位运算符**:除了移位运算符外,Java还提供了按位与`&`、按位或`|`、按位异或`^`等位运算符,以及按位非`~`。 - **复合赋值运算符**:`&=`、`|=`、`^=`等可以用来简化代码,提高可读性。 通过以上的介绍,我们...
- **逻辑运算符** 包括`~`(按位取反)、`&`(按位与)、`|`(按位或)和`^(按位异或)`。 - **移位运算符** 包括`(左移位)、`>>`(有符号右移位)和`>>>(无符号右移位)`。 - 左移位运算符`将左侧操作数向左移动指定位数,...
接下来是位运算符,包括`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位非)、`(左移)、`>>`(有符号右移)和`>>>`(无符号右移)。位运算符对整数类型的二进制表示进行操作: 1. **按位与 (`&`)** 和...
}`或`(x+y)^y`,通过位移和异或运算找到x的符号位,然后与x异或以消除符号位。 6. **取模和位运算**: - `a % (2^n) == a & (2^n - 1)`,当a和2^n没有溢出时,可以将取模运算转换为位与运算。 7. **乘法和位运算...
2. **按位或 (|)**: 对两个操作数的每个对应位执行OR操作,只要有一个位为1,结果位就为1。例如,5与3的结果为7(0000 0000 0000 0000 0000 0000 0000 0111)。 3. **按位非 (~)**: 对一个操作数的所有位取反,0变成...
位运算是指对二进制数进行的操作,例如与运算(&)、或运算(|)、异或运算(^)等。在这里,我们使用了或运算(|)来将四个 byte 型的值合并成一个 int 型。 知识点 6:Java 中的数据类型 在 Java 中,有多种数据...
按位运算有&、|、~、^四种运算符,分别表示与、或、非、异或。移位运算有、>>、>>>三种运算符,分别表示左移、右移、无符号右移。 2.1 与运算(&) 与运算的规则是:转为二进制后,两位都为1,则结果为1,否则结果...
位运算符直接作用于整数类型的二进制表示,包括与(&)、或(|)、异或(^)、非(~)以及左移()和右移(>>、>>>). 这些运算符在进行位级操作时非常有用,比如在位掩码、数据加密、优化算法等方面。 1. **与(&)**: 它执行逐...
位运算符包括按位与(&)、按位或(|)、按位异或(^)和按位非(~)。这些运算符可以用来对二进制位进行逐位操作,从而实现诸如设置或清除特定位、交换变量等复杂操作。 总之,理解和熟练运用Java中的移位运算和...
它首先从`start`字符串中提取出位0、4、10和13,然后通过异或(^)运算生成新的位13(`x13`)。这个异或操作相当于执行了LFSR的线性反馈函数。接着,`start_buffer`用于更新寄存器状态,移除最左边的一位并添加新...