● fixed X - 関数リファレンス
ビットマスクの作成
void __stdcall fixed_create_lmask(PFIXEDVAL pval ,int bit_pos ,int width );
void __stdcall fixed_create_hmask(PFIXEDVAL pval ,int bit_pos ,int width );
引数
引数名 | 意味 |
pval | 結果を返す FIXEDVAL領域の先頭アドレス |
bit_pos | 開始/終了位置(ビットインデックス) |
width | pval の指す FIXEDVAL値の数値幅(バイト単位) |
戻り値
無し
説明
pval の指す領域にビットマスクを作成します。関数fixed_create_lmask は LSB から bit_pos まで、関数fixed_create_hmask は bit_pos から MSB までの間を ビット 1 で埋め、残りの領域はゼロクリアします。
bit_pos は ゼロ 〜 width × 8 - 1 が有効範囲です。範囲を超えるビットインデックスが与えられた場合、width × 8 の剰余が使用されます。
引数 pval の指す領域は、width が示す数値幅以上のサイズを持っている必要があり、width は 4 の倍数である必要があります。
例1.start から end までの間を 1 にするマスクを作成.
#include "fixedX.h"
#define BIT 64
#define SIZE (BIT / 8)
void create_mask1(PFIXEDVAL pval,int start,int end)
{
FIXEDVAL temp[SIZE];
fixed_create_lmask(temp,end,SIZE);
fixed_create_hmask(pval,start,SIZE);
fixed_and(pval,temp,SIZE);
}
#include <stdio.h>
void main(void )
{
FIXEDVAL a[SIZE];
int i;
create_mask1(a,7,61);
/*
0011111111111111111111111111111111111111111111111111111111111111
∧ 1111111111111111111111111111111111111111111111111111111110000000
---------------------------------------------------------------------
0011111111111111111111111111111111111111111111111111111110000000
↑ ↑
end start
*/
for(i = 0;i < BIT;i++)
printf("%d",fixed_lshift1bit(a,SIZE));
printf("\n");
}
例2.LSB から p1 まで、p2 から MSB までの間を 1 にするマスクを作成.
#include "fixedX.h"
#define BIT 64
#define SIZE (BIT / 8)
void create_mask2(PFIXEDVAL pval,int p1,int p2)
{
FIXEDVAL temp[SIZE];
fixed_create_lmask(temp,p1,SIZE);
fixed_create_hmask(pval,p2,SIZE);
fixed_or(pval,temp,SIZE);
}
#include <stdio.h>
void main(void )
{
FIXEDVAL a[SIZE];
int i;
create_mask2(a,35,52);
/*
0000000000000000000000000000111111111111111111111111111111111111
∨ 1111111111110000000000000000000000000000000000000000000000000000
---------------------------------------------------------------------
1111111111110000000000000000111111111111111111111111111111111111
↑ ↑
p2 p1
*/
for(i = 0;i < BIT;i++)
printf("%d",fixed_lshift1bit(a,SIZE));
printf("\n");
}