如何从 shell 计算位选择?
假设我有类似的东西:i[m:l]
i
是一个整数,m
是位选择的 MSB 部分,是位选择l
的 LSB 部分,例如:
250[1:0]
- 将返回“250”的 2 个 LSB 位,答案为“2”250[7:2]
- 将返回“250”的 6 个 MSB 位,答案将是“62”
不确定它的可移植性如何,但 Bash 和 KSH 至少支持按位运算(左移和右移、按位与和或)和求幂。所以你可以直接使用它们来做位掩码。
#! /bin/sh
extract_bits() {
msb=$1 ; lsb=$2 ; num=$3
# Number of bits required
len=$(( $msb + 1 - $lsb ))
# Bitmask == 2^len - 1
mask=$(( 2 ** $len - 1 ))
# Left-shift mask, bitand, right-shift result
echo $(( ( num & ( $mask << $lsb ) ) >> $lsb ))
}
extract_bits 1 0 250
extract_bits 7 2 250
(至于在 shell 脚本中执行此操作是否是一个好主意,好吧,我不相信。)