I-Series RPGLE:测试位数组多位值的高效编码方法问询
简化位数组多位置判断的IF语句
针对你的位数组多位置或判断需求,以下是几种可行的简化方案,同时先说明你尝试的写法不生效的原因:
你尝试的写法不生效的原因
if bi(64) or bi(65) or bi(66) or bi(67) = '1'; 存在两个核心问题:
- 运算符优先级错误:等于号(
=)的优先级高于逻辑或(or),实际执行逻辑是bi(64) or bi(65) or bi(66) or (bi(67) = '1'),完全不符合你的预期。 - 类型不匹配:如果
bi的元素是字符型('1'/'0'),直接对字符使用or逻辑运算属于非法操作——逻辑或只能作用于布尔值,必须先将字符转换为布尔判断(比如bi(n) = '1')。
可行的简化方案
方案1:利用语言内置的归约/遍历函数
多数支持数组的语言都提供了遍历判断或位运算归约的工具,以常见场景为例:
- 硬件描述语言(如VHDL):使用
or_reduce函数对目标位段做或运算,跳过不需要的位(比如你代码里的65位):
if or_reduce(bi(81 downto 66) & bi(64)) = '1' then -- 执行你的逻辑 end if;
- Ada:使用
for some语法遍历判断指定范围:
if (bi(64) = '1') or (for some i in 66..81 => bi(i) = '1') then -- 执行你的逻辑 end if;
- Python:用
any()函数遍历目标位置列表:
# 假设bi是1索引的数组 target_pos = [64] + list(range(66, 82)) if any(bi[pos] == '1' for pos in target_pos): -- 执行你的逻辑
方案2:预定义掩码对比
如果是支持位操作的语言(如Verilog、C),可以将目标位对应的掩码与数组值做位与运算,判断结果是否非零:
// 假设bi是128位的位矢量,64到81位中跳过65位(Verilog为0索引) if ((bi & (1'b1 << 63 | 128'hFFFF_FFFF_FFFF_FFC0)) != 128'h0) begin -- 执行你的逻辑 end
注:掩码需根据目标位置(64、66-81)对应设置,上述示例中1'b1 << 63对应第64位,128'hFFFF_FFFF_FFFF_FFC0对应66-81位。
方案3:封装辅助函数
如果需要多次复用该判断,可以封装一个辅助函数,传入目标位置列表后内部遍历判断:
// 以C语言为例,假设bi是char数组,1索引 int has_one_in_positions(char bi[], int positions[], int count) { for (int i = 0; i < count; i++) { if (bi[positions[i]] == '1') { return 1; } } return 0; } // 使用时 int target_pos[] = {64,66,67,...,81}; if (has_one_in_positions(bi, target_pos, 17)) { -- 执行你的逻辑 }
内容的提问来源于stack exchange,提问作者Darren B
相关产品推荐
相关产品推荐

