シェルからビット選択を計算するにはどうすればよいですか?
私が次のようなものを持っているとしましょう:i[m:l]
i
は整数、m
はビット選択のMSB部分、はビット選択l
のLSB部分です。例:
250[1:0]
-「250」の2LSBビットを返し、答えは「2」になります250[7:2]
-「250」の6MSBビットを返し、答えは「62」になります
これがどれほど移植性があるかはわかりませんが、BashとKSHは、少なくともビット単位の演算(左と右のシフト、ビット単位のANDとOR)、およびべき乗をサポートしています。したがって、これらを直接使用してビットマスクを実行できます。
#! /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
(シェルスクリプトでこれを行うのが良い考えかどうかについては、まあ、私は確信していません。)