3

だから私はビットシーケンスを持っています:

1010

1 は MSB です。

私の関数は、奇数ビットが 0 の場合は整数 0 を返し、1 の場合は 1 を返す必要があります。

forループやその性質のものを使用して、0または1を返す必要があるかどうかを確認することはできません。これについて何か提案はありますか?

not 操作を使用することを考えていましたが、正確に使用する方法を理解できます。

これまでのところ、1010...10 のシーケンスを使用してから、それを AND 処理しています。上記を実行すると、1010 が返されます。ここで、1 を返すか 0 を返すかを調べる必要があります。

4

2 に答える 2

8

32 ビット整数について話しているとします。ANY ODD ビットが SET (1) かどうかを知りたいと思います。

これを行うには、次のような整数を作成します。

10101010101010101010101010101010

ここで、これを AND ( &) すると、すべての偶数ビットが除外されます。数値がゼロでない場合、1 つ以上の奇数ビットが設定されています。C:

#include <stdint.h>

int hasodd(uint32_t x) {
    // 0xAAAAAAAA = 10101010101010101010101010101010
    // double negation to turn x>0 into 1 and leave 0 alone
    return !!(x & 0xAAAAAAAA); 
}

N 番目のビットが設定されているかどうかを返す必要があるという意味であれば、これは機能します。a を正しい位置に右シフトし1て、無関係なビットをすべて除外します。

#include <stdint.h>

int nthbitset(uint32_t x, int n) {
    return x & (1 << n);
}
于 2011-08-26T22:23:09.307 に答える
3

私はあなたの質問の意図について曖昧です—それは宿題のようです。実際のニーズが何であるかに応じて(質問のタイトルやテキストで述べられているように)、これらの1つはほとんどすべてのC実装で機能します。

int hasoddbitset (int v)
{
     return (v & 0xaaaaaaaa) != 0;  // for 32 bit ints
}

int isbitset (int val, int bitnum)
{
     return (val & (1 << bitnum)) != 0;
}
于 2011-08-26T22:34:28.227 に答える