0

これはかなり基本的な質問で、簡単な答えがあると確信していますが、答えを探すために使用すべき検索用語がわかりません。ここに行きます:

ビットマスクの仕組みを理解しようとしています。Linux システムには次のものがあります。

struct stat

これには、検査対象のファイルが通常のファイル、ディレクトリ、シンボリック リンクなどであるかどうかを判断するために使用される st_mode メンバーがあります。したがって、名前を渡してその名前がディレクトリを表しているかどうかを取得できる単純な関数を作成することができます。

16 int isadir( char *name )
17 /*
18  *      calls stat, then masks the st_mode word to obtain the
19  *      filetype portion and sees if that bit pattern is the
20  *      pattern for a directory
21  */
22 {
23         struct stat info;
24 
25         return ( stat(name,&info)!=-1 && (info.st_mode & S_IFMT) == S_IFDIR );
26 }

ビットマスクを見ると、次のように表されていることがわかります。

/* Encoding of the file mode.  */

#define __S_IFMT        0170000 /* These bits determine file type.  */

ビットマスクは 0 と 1 しか持てないと思っていました。なぜマスクに7があるのですか?

4

2 に答える 2

4

先行0で始まる数字は8進数です—これは標準のC構文です。

そして、これらはビットマスク、特にUnixのパーミッションを表すのに役立ちます。

于 2013-02-24T04:01:03.113 に答える
3

バイトは8ビットで、10進数(0〜255)、8進数(000〜377)、16進数(00〜FF)、または2進数(00000000〜11111111)で表すことができます。ビット0からビット7までのビットに番号を付けましょう。

76543210

実際には、数値は任意の基数で表すことができますが、数値をビットに分解する場合は、主に8進数と16進数が便利です。8進数でバイトを表現する方が簡単です。

 z  y  x
76543210

xはビット0〜2、yはビット3〜5、zはビット6および7です。

したがって、あなたの例では、0178進数は

 0   1   7
00 001 111

8進数(8進数)で表された数値は、2進数に変換しやすくなります。(ヘキサで0F)。

C(...)では、8進数のリテラル番号は先行ゼロ(0 ...)で始まり、16進数では先行ゼロ0x(0x ...)で始まります。8進数で表された数値のビットを視覚化する方が簡単なので、

022 & 017

バイナリで与える

"00 010 010" &
"00 001 111"

結果は簡単に見つけることができます

"00 000 010"

10進数では、それはになります18 & 15

于 2013-02-24T04:05:10.247 に答える