2

以下のコードをコンパイルすると、GCCでエラーが発生します。他のまたはシフトラインの代わりにコメントされた2つのラインは機能しますが、キャストが必要であり、真実であるかどうかはわかりません。

エラーは次のとおりです。バイナリへの無効なオペランド| ('char*'と'int'があります)

ありがとう。

void bits2byte(int *bits, char *byte) {
    byte = 0;
    int i;
    for (i = 0; i<8; i++) {
        if (bits[i] == 1) {
            byte = byte | 0x01;
            // byte = (char*)((int)byte | 0x01);
        }
        if (i<7) {
            byte = byte << 0x01;
            // byte = (char*)((int)byte << 0x01);
        }
    }
}
int main() {
    int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1};
    char output_byte;
    bits2byte(input_bits, &output_byte);
}

編集:これは参照渡しの問題であることを理解しています。バイトを変更しようとしています。この関数でビットをバイトに変換したい。実際、私は最初にすべての回答者/コメント投稿者が提案する方法でそれを書きましたが、 http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp? topic =%2Fcomの参照パスの例.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr233.htmは私の心を混乱させました。

4

3 に答える 3

4

ポインターに対してビット単位の操作を行うのはなぜですか? これは良い考えではありません。そのため、コンパイラ エラーが発生します。

*これらの操作を実行できる値を取得するには、ポインターを逆参照する必要があります。

*byte |= 1;

また

*byte <<= 1;

|=コードを単純にするためにand演算子を使用することに注意してください<<=。これは、「ターゲット」式が直接変数よりも長いため、ポインターを処理する場合にさらに便利です。

于 2013-01-23T15:36:52.293 に答える
2

C 標準では、そのような演算子のオペランドはスカラー型でなければならないと規定されています。

C11 (n1570)、§ 6.5.14 論理 OR 演算子
各オペランドはスカラー型でなければなりません。

intptr_t(C99/C11)にキャストできます。

#include <stdint.h>

intptr_t n = (void *)byte;

とにかく、あなたがやろうとしていることを言うのは難しいです。ポインターが指す値に対してこの操作を実行したくありませんか? そのような場合は、逆参照する必要があります。

*byte = *byte | 0x01;
于 2013-01-23T15:37:31.357 に答える
1

それがあなたがやろうとしていることです(私は思う)

void bits2byte(int *bits, char *byte) {
    //notice ALL the work is with "*byte" not "byte" which is the address of the byte.
    *byte = 0;
    for (int i = 0; i < 8; i++) {
        *byte <<= 1;
        if (bits[i] == 1) {
            *byte |= 1;
        }
    }
}

int main() {
    int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1};
    char output_byte; //no use to put value here, we'll override it anyway...
    bits2byte(input_bits, &output_byte);
}
于 2013-01-23T15:42:11.893 に答える