1

私はCを初めて使用し、このコードの平和の中で2つのことを実行しようとしています。

  • 以下の&0xfeと&0x01の目的は何ですか?
  • __u16明らかにこれは変数ですが、どのタイプで何と呼ばれていますか?

前もって感謝します!

static __u16 smile_bmp[] = {0x3C, 0x42, 0x95, 0xA1, 0xA1, 0x95, 0x42, 0x3C};

displayImage(smile_bmp,res, daddress, file);

int displayImage(__u16 bmp[], int res, int daddress, int file)
{
    int i;
    for(i=0; i<8; i++)
        {
         block[i] = (bmp[i]&0xfe) >>1 | (bmp[i]&0x01) << 7;
        }
    res = i2c_smbus_write_i2c_block_data(file, daddress, 16,
        (__u8 *)block);
    sleep(1);
}
4

2 に答える 2

8

式:(bmp[i]&0xfe) >>1 | (bmp[i]&0x01) << 7全体として、実際にはの8つの最下位ビットの回転(別名循環シフト)ですbmp[i]

このbmp[i] & 0xfe部分は、数値を取り込んでbmp[i]下位ビットをマスクしているため(0xfe「16進数のFE」を意味し、2進数に変換さ11111110れます)and、2つを一緒に使用すると、他のビットを変更せずに下位ビットを0に設定します( 、8つの最下位のその他のいずれか-bmp[i]がタイプ__u16の場合、明らかに16ビットであるため、マスクの上位8ビットもゼロであるため、結果でもゼロに設定されます)。

同様に、パーツは最下位ビットbmp[i] & 0x01を除くすべてをマスクしています。0x01は00000001であるため、andこの値を他の値と一緒に使用すると、最下位ビットの元の値が保持され、他のすべてのビットが0に設定されます。

次に、最初のビットを右に1ビット、2番目のビットを左に7ビットシフトし、ビット単位orで2つの部分を元に戻します。最終的な結果として、ビット0として開始されたものがビット7になり、他のすべてが右に1桁シフトされます(前のビット7はビット6になり、前のビット6はビット5になります)。

余談ですが、名前__u8__u16は実装用に予約されているため、実際に実装によって提供されない限り、未定義の動作が発生します(つまり、コードでこれらの名前を定義することはできません)。

于 2013-01-11T15:58:49.570 に答える
5

左側の変数()のビットごとのANDと、16進数で表される定数bmp[i]

于 2013-01-11T15:50:40.653 に答える