● 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開始/終了位置(ビットインデックス)
widthpval の指す 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");
}