移位运算和加减运算的优先级

在实现二分搜索算法时,作者最初未在更新中间值时使用括号,即使用了int mid=l+r+1>>1;,但测试通过。后修正为int mid=(l+r+1)>>1;,结果相同。这揭示了移位运算的优先级低于加减运算。文章反思了位运算优先级高于加减运算的常见误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写二分更新时忘了加括号:

int mid=l+r+1>>1;

测试了样例居然过了,然后加上括号

int mid=(l+r+1)>>1;

最终结果相同,“移位运算的优先级小于加减运算的优先级,运算时先进行加减”
以前一直有种位运算优先级一定高 的观念
改。

### Verilog 中的运算优先级运算优先级规则 #### 1. 运算符分类及其优先级 Verilog 的运算符按照其功能可以分为多个类别,每类运算符具有不同的优先级。以下是详细的分类优先级列表(从高到低排列)[^1]: | 类别 | 运算符 | |--------------------|--------------------------------------------------------------------------------------------| | 单目运算符 | `~`, `!`, `&`, `\|`, `-` | | 幂运算 | `**` | | 乘除模运算 | `*`, `/`, `%` | | 加减运算 | `+`, `-` | | 移位运算 | `<<`, `>>` | | 关系运算符 | `<`, `<=`, `>`, `>=` | | 等式比较 | `==`, `!=`, `===`, `!==` | | 按位与 | `&` | | 按位异或 | `^`, `~^` | | 按位或 | `\|` | | 逻辑与 | `&&` | | 逻辑或 | `\|\|` | | 条件运算符 | `? :` | | 赋值运算符 | `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `\|=`, `^=`, `<<=`, `>>=` | --- #### 2. 特殊说明 - **单目运算符**:这些运算符作用于单一操作数,例如取反 (`~`) 或逻辑非 (`!`)。 - **关系运算符**:用于比较两个操作数之间的大小关系,返回布尔值。 - **按位运算符**:逐位执行二进制操作,适用于整型数据类型的每一位。 - **逻辑运算符**:评估整个表达式的真伪状态,通常用于条件判断。 - **赋值运算符**:不仅完成变量初始化还可能涉及复合计算后再赋值的操作。 --- #### 3. 示例分析 以下是一些具体示例来展示不同级别间如何相互作用以及遵循既定顺序的重要性: ##### 示例 1: 结合多种运算符 ```verilog module priority_example; initial begin integer a, b, c, d; a = 5; b = 3; c = 7; // 表达式混合了加法、乘法移位操作 d = (a + b * c << 2); $display("Result of expression is %d", d); end endmodule ``` 在此情况下: - 首执行乘法 `(b * c)` 得到结果为 `21`. - 接着进行左移操作 `21 << 2` 计算得出 `84`. - 最终加上 `a` 值即得到总的结果 `89`. 注意这里括号强制改变了默认的求解路径从而确保预期效果得以实现. ##### 示例 2: 使用逻辑运算符构建复杂条件 ```verilog module logical_priority; reg [3:0] data_in; always @(*) begin if ((data_in > 4'd8 && data_in < 4'd15) || !data_in) begin $display("Condition met!"); end else begin $display("Condition not met."); end end endmodule ``` 此处: - 分别独立检验子句内的范围检查及零检测. - 再依据逻辑 OR 将两者组合起来形成最终判定标准. --- #### 4. 注意事项 虽然了解并记住所有层次间的相对地位很有帮助,但在实际编码过程中推荐适当加入圆括号明确指示期望的行为模式以免因误解引发错误[^2]. 此外还需留意某些特殊情形下可能存在例外状况比如三元选择器(? :) 应处于最低层以避免混淆解读. ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值