常用位的运算符

逻辑运算符

 

   &  :  当两个都为1的时候为1                                  例如: 00001010 &  00001001 = 00001000

 

   |   :当两个任何一个为1的时候为1                          例如: 00001010 &  00001001 = 00001011

 

   ^  :  当两个只有一个为1的时候为1                          例如: 00001010 &  00001001 = 00000011

 

 

移位运算

 

  >> 与>>>   前者称为有符号位,后者称为无符号位

 

  有符号位正数 向右移动高位用0填充, 负数用1填充

  无符号位直接用 0 填充

 

  左移相同: << 与 <<< 不过负数的高位是在后面

 

<think>我们之前已经详细讨论了按异或(^)或(|),现在用户想了解其他常用运算符。根据引用[1],运算符包括:&(按与)、|(按或)、^(按异或)、~(按非)、<<(左移)、>>(右移)。我们已经详细讲解了|^,现在需要补充&、~、<<、>>。注意:引用[2]是关于布尔逻辑运算符的(&&、||、!),虽然与运算符有相似之处(如逻辑与与),但它们是不同的概念。用户明确询问运算符,因此我们重点介绍运算符,但可以简要对比逻辑运算符运算符的区别。计划回答结构:1.按与(&)运算符:定义、规则、真值表、应用场景2.按非(~)运算符:定义、规则、应用场景3.左移运算符(<<):定义、规则、应用场景(乘以2的幂)4.右移运算符(>>):定义、规则(注意算术右移逻辑右移)、应用场景(除以2的幂)5.补充说明:运算符与逻辑运算符的区别(因为引用[2]提到了布尔逻辑运算符,为避免混淆,简要说明)6.总结表格:列出所有运算符及其功能7.生成相关问题注意:在C/C++/Java等语言中,运算符的操作数必须是整数类型(包括字符类型)。</think>### 常用运算符详解 运算符直接对整数的二进制进行操作,常用于底层编程、硬件操作性能优化场景。以下是完整的运算符体系(以C语言为例): #### 一、按运算符 `&` 1. **运算规则** - 对应均为1时结果为1,否则为0 - 真值表: | A | B | A & B | |---|---|-------| | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 | 2. **典型应用** ```c // 检查特定是否为1 if (value & (1 << n)) printf("第%d是1", n); // 清零特定 value &= ~(1 << 5); // 清零第5 ``` #### 二、按运算符 `|` (已详述) - 核心功能:置操作 - 示例:`flags |= 0x80; // 设置最高` #### 三、按异或运算符 `^` (已详述) - 核心功能:切换 - 示例:`data ^= 0xFF; // 所有取反` #### 四、按运算符 `~` 1. **运算规则** - 一元运算符,所有取反 - 真值表: | A | ~A | |---|----| | 0 | 1 | | 1 | 0 | 2. **典型应用** ```c // 创建掩码的反码 unsigned int mask = 0b00001111; unsigned int inverted = ~mask; // 0b11110000 // 配合&使用清零特定 value &= ~(1 << 3); // 清零第3 ``` #### 五、左移运算符 `<<` 1. **运算规则** - 将二进制向左移动指定数 - 低补0,高溢出丢弃 - 数学等效:$x << n = x \times 2^n$ 2. **典型应用** ```c // 快速乘以2的幂 int x = 5; int y = x << 2; // 20 (5*4) // 设置特定 int bitmask = 1 << 7; // 第7为1的掩码 ``` #### 六、右移运算符 `>>` 1. **运算规则** - 将二进制向右移动指定数 - 有符号数:高补符号(算术右移) - 无符号数:高补0(逻辑右移) - 数学等效:$x >> n = \lfloor x / 2^n \rfloor$ 2. **典型应用** ```c // 快速除以2的幂 unsigned int a = 20; unsigned int b = a >> 2; // 5 (20/4) // 提取特定 int bit = (value >> 4) & 1; // 提取第4 ``` #### 七、运算符优先级与类型要求 | 运算符 | 优先级 | 结合性 | 操作数要求 | |--------|--------|--------|------------------| | ~ | 高 | 右→左 | 整型 | | << >> | 中 | 左→右 | 整型 | | & | 低 | 左→右 | 整型 | | ^ | 低 | 左→右 | 整型 | | \| | 低 | 左→右 | 整型 | > **注意**:运算符与逻辑运算符的区别: > - 运算符(`&`,`|`,`^`)操作**整数的二进制** > - 逻辑运算符(`&&`,`||`,`!`)操作**布尔值**,具有短路特性[^2] #### 八、综合应用示例 ```c // 颜色编码操作 (RGB888格式) #define RED_MASK 0xFF0000 #define GREEN_MASK 0x00FF00 #define BLUE_MASK 0x0000FF uint32_t color = 0x3366CC; // RGB(51,102,204) // 提取绿色分量 uint8_t green = (color & GREEN_MASK) >> 8; // 102 // 设置红色分量 color = (color & ~RED_MASK) | (0x99 << 16); // 新颜色0x9966CC ``` --- ### 相关问题 1. 如何用操作交换两个整数的值而不使用临时变量? 2. 表达式 `(value >> 4) & 0xF` 实现了什么功能? 3. 运算符在加密算法中有哪些具体应用场景? 4. 为什么说 `x << n` 比 `x * pow(2, n)` 性能更高? 5. 如何检测整数是否是2的幂次方? 6. 字段(`bit-field`)与掩码操作有何异同? [^1]: 运算符底层实现原理 [^2]: 布尔逻辑运算符运算符对比分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值