转载:java运算符 与(&)、非(~)、或(|)、异或(^)

本文详细解析了位运算中的异或、与、或、非等操作,包括它们的基本概念、运算规则及实际应用,并通过实例展示了如何将十进制数转换为二进制数,以及如何从二进制数转换回十进制数。

转载自 https://www.cnblogs.com/yesiamhere/p/6675067.html

最近看HashMap源码,遇到了这样一段代码:

1     static final int hash(Object key) {
2         int h;
3         return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
4     }

于是我整理学习了以下知识:
1.十进制转二进制

原理:给定的数循环除以2,直到商为0或者1为止。将每一步除的结果的余数记录下来,然后反过来就得到相应的二进制了。

比如8转二进制,第一次除以2等于4(余数0),第二次除以2等于2(余数0),第三次除以2等于1(余数0),最后余数1,得到的余数依次是0 0 0 1 ,

反过来就是1000,计算机内部表示数的字节长度是固定的,比如8位,16位,32位。所以在高位补齐,java中字节码是8位的,所以高位补齐就是00001000.

写法位(8)10=(00001000)2;

代码实现:

复制代码

 1 package sourceCode.hashMap;
 2 
 3 public class mapHashCodeTest {
 4     public static void main(String[] args) {
 5         String str = toBinary(8);
 6         System.out.println(str);
 7     }
 8 
 9     static String toBinary(int num) {
10         String str = "";
11         while (num != 0) {
12             str = num % 2 + str;
13             num = num / 2;
14         }
15         return str;
16     }
17 
18 }

复制代码

运行结果:1000

2.二进制转十进制

计算也很简单,比如8的二进制表示位00001000,去掉补齐的高位就是1000.此时从个位开始计算2的幂(个位是0,依次往后推)乘以对应位数上的数,然后得到的值想加

于是有了,(2的0次幂)*0+(2的1次幂)*0+(2的2次幂)*0+(2的3次幂)*1 = 8

代码实现,直接调用Integer.parseInt("",2);

1 System.out.println(Integer.parseInt("1000",2));

运行结果:8

3.位异或运算(^)

运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。

比如:8^11.

8转为二进制是1000,11转为二进制是1011.从高位开始比较得到的是:0011.然后二进制转为十进制,就是Integer.parseInt("0011",2)=3;

 

延伸:

4.位与运算符(&)

运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。

比如:129&128.

129转换成二进制就是10000001,128转换成二进制就是10000000。从高位开始比较得到,得到10000000,即128.

 

5.位或运算符(|)

运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。

比如:129|128.

129转换成二进制就是10000001,128转换成二进制就是10000000。从高位开始比较得到,得到10000001,即129.

 

6.位非运算符(~)

运算规则:如果位为0,结果是1,如果位为1,结果是0.

比如:~37

在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.

8转为二进制是100101.

补码后为: 00000000 00000000 00000000 00100101

取反为:    11111111 11111111 11111111 11011010

因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。

因此,我们可将这个二进制数的补码进行还原: 首先,末尾减1得反码:11111111 11111111 11111111 11011001 其次,将各位取反得原码:

00000000 00000000 00000000 00100110,此时二进制转原码为38

所以~37 = -38. 

<think>好的,我现在要回答用户关于Java逻辑运算符&&、||和^的用法及区别的问题。首先,我需要回忆相关知识,并参考提供的引用内容,确保回答准确。 用户提到了三个运算符&&(逻辑)、||(逻辑)和^(逻辑异或)。我需要分别解释它们的用法、区别,并举例说明。同时,根据引用资料,尤其是引用[2]、[3]、[4],这些内容提供了基础信息和优先级规则,需要整合到回答中。 首先,逻辑&&和逻辑||是常用的短路运算符,而^是按位异或,但用于布尔值时作为逻辑异或。需要区分短路短路(&和|)的不同,但用户主要关注的是&&、||和^,所以可能不需要深入讨论单&和|,但可能需要对比说明,尤其是用户可能混淆的地方。 接下来,我需要结构清晰,分点解释每个运算符: 1. 逻辑&&: - 用法:当两个操作数都为true时,结果才为true。 - 短路特性:如果左边为false,右边不执行。引用[2]和[4]提到这一点。 - 示例:如(x > 0) && (x < 100),来自引用[4]。 2. 逻辑||: - 用法:任一操作数为true,结果为true。 - 短路特性:左边为true时,右边不执行。 - 示例:如y%4==0 || y%3==0,来自引用[4]。 3. 逻辑异或^: - 用法:两个操作数不同时结果为true,相同则为false。 - 注意:Java中没有逻辑异或的关键字,但^作为按位运算符,当操作数是布尔值时,可以起到逻辑异或的作用。需要明确说明这一点,避免用户混淆。 - 示例:比如true ^ false结果为true,而true ^ true为false。 然后,需要讨论它们的区别,包括: - 短路短路的区别(但用户的问题主要是&&和||,而^不涉及短路,所以可能不需要深入,除用户提到)。 - 优先级:根据引用[4],! > && > ||,而^的优先级需要查证,可能位于关系运算符之后,但需要确认。不过用户问题中没有涉及优先级,可能可以简要提及。 - 使用场景:何时使用&&和||,何时使用^。 另外,用户提供的引用中有提到&和|的区别,但用户的问题没有涉及,所以可能不需要展开,除必要。但需要明确说明&&和||是逻辑运算符,而^在布尔操作中是逻辑异或,但作为按位运算符时处理整数。 还需要注意示例代码的正确性,比如使用中文注释者合适的例子。例如,在Java中: boolean a = true; boolean b = false; boolean resultAnd = a && b; // false boolean resultOr = a || b; // true boolean resultXor = a ^ b; // true 这些示例可以帮助用户理解。 在回答过程中,要确保引用的正确应用,比如引用[2]和[4]关于短路特性的说明,引用[4]中的优先级规则。 可能还需要指出,逻辑运算符的操作数必须是布尔类型,而按位运算符可以处理整数,但^用于布尔时作为逻辑异或。 最后,生成相关问题,比如关于短路求值的影响、优先级问题、异或的应用场景等。 现在需要检查是否有遗漏错误,例如: - 是否混淆了按位异或和逻辑异或?在Java中,当操作数是布尔时,^确实是逻辑异或,否则是按位。这点需要明确。 - 确保每个运算符的说明准确,示例正确。 - 确保引用标记正确,比如引用[^2]、[^4]在适当的位置。 总结结构: 1. 逻辑&&:用法、短路、示例,引用支持。 2. 逻辑||:同上。 3. 逻辑异或^:用法,注意点,示例。 4. 区别总结:短路特性、结果计算、适用场景。 5. 示例代码。 6. 相关问题。</think>### Java逻辑运算符 &&、||、^ 的用法及区别 #### 1. 逻辑运算符 `&&` - **用法**:当且仅当两个操作数均为 `true` 时,结果为 `true`,否则为 `false`。 - **短路特性**:若左侧表达式为 `false`,右侧表达式不再执行[^2]。 - **示例**: ```java boolean result = (x > 0) && (x < 100); // 当x在(0,100)区间时为true ``` #### 2. 逻辑运算符 `||` - **用法**:若任意一个操作数为 `true`,结果为 `true`,否则为 `false`。 - **短路特性**:若左侧表达式为 `true`,右侧表达式不再执行[^2]。 - **示例**: ```java boolean result = (y % 4 == 0) || (y % 3 == 0); // y能被43整除时为true ``` #### 3. 逻辑异或运算符 `^` - **用法**:当两个操作数不同(一个 `true`,一个 `false`)时,结果为 `true`;否则为 `false`。 - **注意**:`^` 在Java中既是按位异或运算符(操作整数),也是逻辑异或运算符(操作布尔值)[^3]。 - **示例**: ```java boolean a = true, b = false; boolean result = a ^ b; // true(因为a和b不同) ``` #### 主要区别 | 特性 | `&&` | `||` | `^` | |---------------------|--------------------------|--------------------------|--------------------------| | **结果条件** | 全真为真 | 任意为真则真 | 不同为真 | | **短路求值** | 支持(左假则跳过右)[^4] | 支持(左真则跳过右) | 不支持(始终计算两侧) | | **操作数类型** | 布尔值 | 布尔值 | 布尔值整数(按位异或) | #### 代码示例 ```java public class LogicalOperators { public static void main(String[] args) { boolean a = true, b = false; // && 示例 System.out.println(a && b); // false // || 示例 System.out.println(a || b); // true // ^ 示例 System.out.println(a ^ b); // true System.out.println(a ^ !b); // false(a和!b均为true) } } ``` #### 优先级规则 - 逻辑 `!` > 逻辑 `&&` > 逻辑 `||`。 - 异或 `^` 的优先级低于关系运算符(如 `>`、`==`),但高于赋值运算符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值