布尔类型 &=,|=,^= 的用法

本文通过Java代码演示了布尔运算符“&=”、“|=”和“^=”的使用方法及效果,帮助读者理解这些运算符如何改变变量的值。
转载:http://blog.youkuaiyun.com/ziwen00/article/details/40656897 
代码:
public class MainMethod {  
    public static void main(String[] args) {  
        boolean flag = true;  
        flag &= true;  
        System.out.println("true\t&=\ttrue\t==>\t" + flag);  
        flag = true;  
        flag &= false;  
        System.out.println("true\t&=\tfalse\t==>\t" + flag);   
        flag = false;  
        flag &= true;  
        System.out.println("false\t&=\ttrue\t==>\t" + flag);   
        flag = false;  
        flag &= false;  
        System.out.println("false\t&=\tfalse\t==>\t" + flag+"\n");   
          
        flag = true;  
        flag |= true;  
        System.out.println("true\t|=\ttrue\t==>\t" + flag);  
        flag = true;  
        flag |= false;  
        System.out.println("true\t|=\tfalse\t==>\t" + flag);   
        flag = false;  
        flag |= true;  
        System.out.println("false\t|=\ttrue\t==>\t" + flag);   
        flag = false;  
        flag |= false;  
        System.out.println("false\t|=\tfalse\t==>\t" + flag+"\n");   
          
        System.out.println("^=  相同为真,不同为假");  
        flag = true;  
        flag ^= true;  
        System.out.println("true\t^=\ttrue\t==>\t" + flag);  
        flag = true;  
        flag ^= false;  
        System.out.println("true\t^=\tfalse\t==>\t" + flag);   
        flag = false;  
        flag ^= true;  
        System.out.println("false\t^=\ttrue\t==>\t" + flag);   
        flag = false;  
        flag ^= false;  
        System.out.println("false\t^=\tfalse\t==>\t" + flag);   
    }  
}  


执行结果:
true    &=    true    ==>    true
true    &=    false    ==>    false
false    &=    true    ==>    false
false    &=    false    ==>    false
true    |=    true    ==>    true
true    |=    false    ==>    true
false    |=    true    ==>    true
false    |=    false    ==>    false
^=  相同为真,不同为假
true    ^=    true    ==>    false
true    ^=    false    ==>    true
false    ^=    true    ==>    true
false    ^=    false    ==>    false


<think>我们首先需要理解C语言中位运算符和逻辑运算符的区别。 在C语言中: & 是按位与运算符 && 是逻辑与运算符 | 是按位或运算符 || 是逻辑或运算符 ^ 是按位异或运算符 下面我们分别解释这些运算符,并给出代码示例。 1. 按位与(&): 对两个操作数的每一位进行与操作。如果两个相应的位都为1,则该位的结果为1,否则为0。 例如: 5 & 3 // 5的二进制是101,3的二进制是011,按位与得到001,即1。 2. 逻辑与(&&): 用于布尔值(真或假)。如果两个操作数都非零(真),则结果为1(真),否则为0(假)。 例如: 5 && 3 // 结果为1,因为5和3都是非零值。 3. 按位或(|): 对两个操作数的每一位进行或操作。如果两个相应的位中有一个为1,则该位的结果为1,否则为0。 例如: 5 | 3 // 101 | 011 得到 111,即7。 4. 逻辑或(||): 用于布尔值。如果两个操作数中有一个非零(真),则结果为1(真),否则为0(假)。 例如: 5 || 0 // 结果为1,因为5是非零值。 5. 按位异或(^): 对两个操作数的每一位进行异或操作。如果两个相应的位值相同,则结果为0,否则为1。 例如: 5 ^ 3 // 101 ^ 011 得到 110,即6。 注意:逻辑运算符(&&和||)具有短路特性。即: - 对于逻辑与(&&),如果第一个操作数为假,则不会计算第二个操作数。 - 对于逻辑或(||),如果第一个操作数为真,则不会计算第二个操作数。 下面我们用代码来演示这些运算符的用法: ```c #include <stdio.h> int main() { int a = 5; // 二进制: 0101 int b = 3; // 二进制: 0011 // 按位与 printf("a & b = %d\n", a & b); // 输出: 1 (0001) // 逻辑与 printf("a && b = %d\n", a && b); // 输出: 1 (真) // 按位或 printf("a | b = %d\n", a | b); // 输出: 7 (0111) // 逻辑或 printf("a || b = %d\n", a || b); // 输出: 1 (真) // 按位异或 printf("a ^ b = %d\n", a ^ b); // 输出: 6 (0110) // 演示短路特性 int c = 0; int d = 1; // 逻辑与短路: 因为c为0,所以不会执行d++,因此d的值不变 if (c && d++) { printf("This won't be printed.\n"); } printf("d after (c && d++): %d\n", d); // 输出: 1 // 逻辑或短路: 因为d为1(非0),所以不会执行c++,因此c的值不变 if (d || c++) { printf("This will be printed.\n"); } printf("c after (d || c++): %d\n", c); // 输出: 0 return 0; } ``` 这段代码首先声明了两个整数a和b,然后分别使用位运算符和逻辑运算符进行操作并打印结果。紧接着,我们通过两个if语句演示了逻辑运算符的短路特性。 输出结果应该是: ``` a & b = 1 a && b = 1 a | b = 7 a || b = 1 a ^ b = 6 d after (c && d++): 1 This will be printed. c after (d || c++): 0 ``` 注意:在短路特性演示中,第一个逻辑与(c && d++)因为c为0,所以d++不会被执行,因此d的值保持为1。而第二个逻辑或(d || c++)因为d为1,所以c++不会被执行,因此c保持为0。 §§相关问题§§: 1. C语言中,位运算符和逻辑运算符的主要区别是什么? 2. 什么是短路求值?它在实际编程中有哪些应用? 3. 按位异或(^)有哪些常见的应用场景? 4. 如何利用位运算实现两个整数的交换而不使用临时变量? </think> # C语言中的位运算符与逻辑运算符:`&`, `&&`, `|`, `||`, `^` 在C语言中,`&`, `&&`, `|`, `||`, `^` 是常用的运算符,分别用于位运算和逻辑运算。下面我将详细解释这些运算符的功能、区别和使用场景。 ## 1. 位运算符 vs 逻辑运算符 | 运算符 | 类型 | 操作对象 | 结果类型 | 短路特性 | |--------|------------|----------|----------|----------| | `&` | 按位与 | 整数值 | 整数值 | 无 | | `&&` | 逻辑与 | 布尔值 | 布尔值 | 有 | | `|` | 按位或 | 整数值 | 整数值 | 无 | | `||` | 逻辑或 | 布尔值 | 布尔值 | 有 | | `^` | 按位异或 | 整数值 | 整数值 | 无 | ## 2. 详细解释与代码示例 ### 按位与 (`&`) 对两个整数的二进制表示逐位进行与操作: - 只有两个位都为1时结果才为1 - 常用于掩码操作、清除特定位 ```c #include <stdio.h> int main() { unsigned char a = 0b10101010; // 170 unsigned char b = 0b11001100; // 204 // 按位与操作 unsigned char result = a & b; // 二进制: 10001000 (136) printf("a & b = %d\n", result); // 输出: 136 // 实际应用:检查特定位 int flags = 0b00000110; // 6 int mask = 0b00000010; // 2 if (flags & mask) { printf("Bit 1 is set!\n"); // 会被执行 } return 0; } ``` ### 逻辑与 (`&&`) 对两个布尔表达式进行逻辑与操作: - 只有两个表达式都为真时结果才为真 - 具有短路特性:如果第一个表达式为假,不计算第二个表达式 ```c #include <stdio.h> #include <stdbool.h> int main() { int x = 5, y = 10; // 逻辑与操作 bool result = (x < 10) && (y > 5); printf("(x<10) && (y>5): %d\n", result); // 输出: 1 (true) // 短路特性演示 int count = 0; bool test = (x > 10) && (++count > 0); printf("After short-circuit: count = %d\n", count); // 输出: 0 return 0; } ``` ### 按位或 (`|`) 对两个整数的二进制表示逐位进行或操作: - 只要有一个位为1,结果位就为1 - 常用于设置特定位 ```c #include <stdio.h> int main() { unsigned char a = 0b10100000; // 160 unsigned char b = 0b00001010; // 10 // 按位或操作 unsigned char result = a | b; // 二进制: 10101010 (170) printf("a | b = %d\n", result); // 输出: 170 // 实际应用:设置特定位 int flags = 0b00000100; // 4 int mask = 0b00000010; // 2 flags = flags | mask; // 设置第1位 printf("Flags after set: %d\n", flags); // 输出: 6 (0b00000110) return 0; } ``` ### 逻辑或 (`||`) 对两个布尔表达式进行逻辑或操作: - 只要有一个表达式为真,结果就为真 - 具有短路特性:如果第一个表达式为真,不计算第二个表达式 ```c #include <stdio.h> #include <stdbool.h> int main() { int age = 16; bool hasPermission = false; // 逻辑或操作 bool canAccess = (age >= 18) || hasPermission; printf("Can access: %d\n", canAccess); // 输出: 0 (false) // 短路特性演示 int value = 0; bool test = (value != 0) || (printf("This won't print\n") && 0); // 不会执行printf,因为(value != 0)为false,需要检查第二个表达式 return 0; } ``` ### 按位异或 (`^`) 对两个整数的二进制表示逐位进行异或操作: - 两个位不同时结果为1,相同时结果为0 - 常用于切换特定位、交换变量值 ```c #include <stdio.h> int main() { unsigned char a = 0b10101010; // 170 unsigned char b = 0b11001100; // 204 // 按位异或操作 unsigned char result = a ^ b; // 二进制: 01100110 (102) printf("a ^ b = %d\n", result); // 输出: 102 // 实际应用1:切换特定位 int flags = 0b00000110; // 6 int toggleMask = 0b00000010; // 2 flags = flags ^ toggleMask; // 切换第1位 printf("Flags after toggle: %d\n", flags); // 输出: 4 (0b00000100) // 实际应用2:交换两个变量值 int x = 5, y = 9; printf("Before swap: x=%d, y=%d\n", x, y); x = x ^ y; y = x ^ y; x = x ^ y; printf("After swap: x=%d, y=%d\n", x, y); // 输出: x=9, y=5 return 0; } ``` ## 3. 常见错误与注意事项 1. **混淆位运算和逻辑运算**: ```c int a = 2, b = 3; // 错误:本意是逻辑与,但使用了按位与 if (a & b) { // 2 & 3 = 2 (true),但逻辑上应为a和b都非零 // 会执行 } ``` 2. **短路特性的误用**: ```c int *ptr = NULL; // 安全写法:利用短路特性避免空指针解引用 if (ptr != NULL && *ptr == 10) { // 安全 } // 危险写法:按位与没有短路特性 if (ptr != NULL & *ptr == 10) { // 可能崩溃 // ... } ``` 3. **运算符优先级问题**: ```c int a = 1, b = 2, c = 3; int result = a | b & c; // 等价于 a | (b & c) // 使用括号明确优先级 int better = (a | b) & c; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值