ユーザから提供された番号に対してマスク値を調べる必要があります。上位ビットを1に、残りのビットを0に切り替えます。例:10110〜10000
たとえば、ユーザは、(バイナリ10110に)
を
22などの入力を提供し、私は
1
として入力の上位ビットを変更することにより、マスク値を見つけ、0
に静止する必要がある場合。 は、したがって、この場合には、それは次のようになります(バイナリ10000中)はそうする
c
言語のいずれかの作り付けの方法があります。
ユーザから提供された番号に対してマスク値を調べる必要があります。上位ビットを1に、残りのビットを0に切り替えます。例:10110〜10000
たとえば、ユーザは、(バイナリ10110に)
を
22などの入力を提供し、私は
1
として入力の上位ビットを変更することにより、マスク値を見つけ、0
に静止する必要がある場合。 は、したがって、この場合には、それは次のようになります(バイナリ10000中)はそうする
c
言語のいずれかの作り付けの方法があります。
あなたはそれを持っていたら、ちょうど適切なマスク値を取得するために左シフト最上位ビット
の位置を計算することができます:
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
の場合の特定のケース)
Thx完璧に動作します。 – user5708039
基本的には、最も近い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);
}
入力の最上位ビットがセットされている場合、これは機能しません。 'floor_align32pow2(0x80000000)'は0x80000000の代わりに0を返します。 'return(x >> 1)+(x & 1);'。 –
@IanAbbottあなたは正しいです、ありがとう –
バイナリをお探しですか? ( '22&16 == 16') – cubrr
したがって、1の最上位ビットを保持し、他のビットをすべて0に設定しますか?例:1010 - > 1000、10100111 - > 100000000、111 - > 100などです。このような組み込み関数はありませんが、自分で書き込むことは簡単です(推定4-5行)。 –
@cubrrもし私がすでに価値16を持っていたら、ここでANDをするのは何ですか?入力が86なら2番目のオペランドを計算する必要があり、それが私の目的です。 – user5708039