http://qiita.com/7of9/items/4659da725d849eaf6b44
の続き
以下の指定をして変数から変数へ数値をコピーしたい
- コピーする数値の桁数指定 (例: 3桁)
- コピーする数値のMSB位置指定
- コピー先のビットサイズ指定
#include <stdio.h>
void sizedCopy_shifted(int srcSize, int srcVal, int dstMSB, int dstSize, unsigned long *dstPtr)
{
// dstMSB : [0..] index of dst MSB
unsigned long mask = (1u << srcSize) - 1;
int lsbPos = dstMSB + srcSize - 1; // LSB position of the srcVal
int shift = dstSize - lsbPos - 1;
unsigned long workVal;
mask = (mask << shift);
workVal = (srcVal << shift);
*dstPtr &= ~mask;
*dstPtr |= (workVal & mask);
}
int main(void) {
unsigned long ulval = 0;
// srcSize, srcVal, dstMSB, dstSize, *dstPtr
sizedCopy_shifted(3, 0x5, /* dstMSB=*/6, 10, &ulval); // to 0x0A
sizedCopy_shifted(3, 0x4, /* dstMSB=*/3, 10, &ulval); // to 0x4A
sizedCopy_shifted(3, 0x3, /* dstMSB=*/0, 10, &ulval); // to 0x1CA
printf("0x%X", ulval);
return 0;
}