0

如何从 shell 计算位选择?

假设我有类似的东西:i[m:l]

i是一个整数,m是位选择的 MSB 部分,是位选择l的 LSB 部分,例如:

  • 250[1:0]- 将返回“250”的 2 个 LSB 位,答案为“2”
  • 250[7:2]- 将返回“250”的 6 个 MSB 位,答案将是“62”
4

1 回答 1

2

不确定它的可移植性如何,但 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 脚本中执行此操作是否是一个好主意,好吧,我不相信。)

于 2013-03-03T11:59:10.773 回答