1

重複の可能性:
Cのビット演算子を使用して、数値がゼロ以外かどうかを確認します。

こんにちは、みんな、

私はプロジェクトに取り組んでおり、関数について少し助けが必要です。次のビット演算子のみを使用して、論理否定!を実行する関数を作成する必要があります。

~ & ^ | + << >>

どこから始めればいいのかわからない。

4

3 に答える 3

3

true = 1とを想定できる場合false = 0、これでうまくいくかもしれません。

bool
not(bool x) {
    bool not_x = x ^ true;
    return not_x;
}
于 2010-10-28T05:20:22.143 に答える
3

値がゼロでない場合は 0 を返し、それ以外の場合は 1 を返します。32 ビットの int を想定すると、次のようになります。

int not_func(int v) {
    /* compress value to single bit */
    int p = (v >> 16) | v;
    p = (p >> 8) | p;
    p = (p >> 4) | p;
    p = (p >> 2) | p;
    p = (p >> 1) | p;

    p ^= 1;
    return (p & 1);
}
于 2010-10-28T07:35:31.743 に答える
2

まず、質問を明確にしたいと思います。ワード内のいずれかのビットが「1」の場合は 0 を返し、すべてのビットがゼロの場合は 0 以外を返す関数が必要なようです。32 ビットの単語 "a" を想定すると、次のようなことができます。

na1 = ~a;
shifted_na1 = na1 >> 1;
na2 = shifted_na1 & na1; /* any sequence of zeros is now 2 bits long */
shifted_na2 = na2 >> 2;
na3 = shifted_na2 & na2; /* any sequence of zeros is now 4 bits long */
shifted_na3 = na3 >> 4;
na4 = shifted_na3 & na3; /* any sequence of zeros is now 8 bits long */
shifted_na4 = na4 >> 8;
na5 = shifted_na4 & na4; /* any sequence of zeros is now 16 bits long */
shifted_na5 = na5 >> 16;
final = shifted_na5 & na5; /* any sequence of zeros is now 32 bits long */
really_final = final & 1;
于 2010-10-28T06:02:05.923 に答える