3

バイト値を直接設定できる構造を定義しようとしていますが、bit_set()、bit_clear() などの関数を使用せずにバイトのビットを操作することもできます。これが私の定義です

typedef union FLAG_WORK {
    volatile unsigned char BYTE;
    struct {
        volatile unsigned char bit0:1;
        volatile unsigned char bit1:1;
        volatile unsigned char bit2:1;
        volatile unsigned char bit3:1;
        volatile unsigned char bit4:1;
        volatile unsigned char bit5:1;
        volatile unsigned char bit6:1;
        volatile unsigned char bit7:1;
    }BIT;
}FLAG8;

とサンプルコード

int main()
{
    FLAG8 i;
    i.BYTE=(unsigned char)0; // initial the value of i.BYTE
    i.BIT.bit0 = 1; // set bit0 of i.BYTE
    i.BIT.bit1 = 1;
    cout << (int)i.BYTE << endl;
    cout << "Hello world!" << endl;
    return 0;
}

上記のコードの「i」に値を直接割り当てることができるように構造を変更する方法を知りたいですか?なにか提案を?

4

2 に答える 2

2

通常どおり、次のように割り当てることができますが、ここのユニオンは 1 バイトのメモリしか保持しないため、値は重複しています。

FLAG8 i = { .BIT = { .bit2 = 1, .bit5 = 1 } , .BYTE = 42};
//result of i.BYTE is 42 depens on Byte value
FLAG8 i = {  .BYTE = 42 , .BIT = { .bit2 = 1, .bit5 = 1 } };
//result of i.BYTE is 36 depends on bits values 

1. @Christophが提案したように、値BYTEまたはビットごとに直接割り当てることができますこのように

 FLAG8 i = { .BYTE = 42 };
 FLAG8 j = { .BIT = { .bit2 = 1, .bit5 = 1 } };
 printf("%d \n\n",(int)i.BYTE );
 printf("%d \n\n",(int)j.BYTE );

2.ビットごとに値を割り当てることができます

    i.BIT.bit0 = 1; // set bit0 of i.BYTE
    i.BIT.bit1 = 1;
    i.BIT.bit4 = 1;
   printf("%d \n\n",(int)i.BYTE );

3.16進数値でBYTEを直接割り当てることができます

  i.BYTE=0x10;
   printf("%d \n\n",(int)i.BYTE );

4.10進数値でBYTEを直接割り当てることができます

i.BYTE=100;
printf("%d \n\n",(int)j.BYTE );

5.同じタイプの識別子で直接割り当てることができます

j.BYTE=0x30;
printf("%d \n\n",(int)j.BYTE );
i=j;
printf("%d \n\n",(int)i.BYTE );

6.10進数値を割り当て、10進数と16進数形式の両方の印刷で確認します

j.BYTE=100;
printf("%d \n\n",(int)j.BYTE );
printf("%x \n\n",(int)j.BYTE );
j.BIT.bit4=0;
j.BIT.bit5=0;
printf("%d \n\n",(int)j.BYTE );
printf("%x \n\n",(int)j.BYTE );
于 2013-09-07T07:56:49.853 に答える