2017-08-30 7 views
2

ユーザから提供された番号に対してマスク値を調べる必要があります。上位ビットを1に、残りのビットを0に切り替えます。例:10110〜10000

たとえば、ユーザは、(バイナリ10110に)

22などの入力を提供し、私は1として入力の上位ビットを変更することにより、マスク値を見つけ、0に静止する必要がある場合。 は、したがって、この場合には、それは次のようになります(バイナリ10000中)

はそうするc言語のいずれかの作り付けの方法があります。

+0

バイナリをお探しですか? ( '22&16 == 16') – cubrr

+0

したがって、1の最上位ビットを保持し、他のビットをすべて0に設定しますか?例:1010 - > 1000、10100111 - > 100000000、111 - > 100などです。このような組み込み関数はありませんが、自分で書き込むことは簡単です(推定4-5行)。 –

+0

@cubrrもし私がすでに価値16を持っていたら、ここでANDをするのは何ですか?入力が86なら2番目のオペランドを計算する必要があり、それが私の目的です。 – user5708039

答えて

1

あなたはそれを持っていたら、ちょうど適切なマスク値を取得するために左シフト最上位ビット

の位置を計算することができます:

unsigned int x = 22; 
    int result = 0; 

    if (x != 0) 
    { 
    unsigned int y = x; 
    int bit_pos=-1; 
    while (y != 0) 
    { 
     y >>= 1; 
     bit_pos++; 
    } 
    result = 1<<bit_pos; 
    } 

これはresult

16に設定します(あります入力した値が 0の場合の特定のケース)

+0

Thx完璧に動作します。 – user5708039

0

基本的には、最も近い2つの数。私はそのための標準的な機能があるとは思えませんが、以下を試してください:

static inline uint32_t 
floor_align32pow2(uint32_t x) 
{ 
     x |= x >> 1; 
     x |= x >> 2; 
     x |= x >> 4; 
     x |= x >> 8; 
     x |= x >> 16; 

     return (x >> 1) + (x & 1); 
} 
+1

入力の最上位ビットがセットされている場合、これは機能しません。 'floor_align32pow2(0x80000000)'は0x80000000の代わりに0を返します。 'return(x >> 1)+(x & 1);'。 –

+0

@IanAbbottあなたは正しいです、ありがとう –

関連する問題