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 开头的数字是八进制数——这是标准的 C 语法。

这些对于位掩码很有用,尤其是表示 Unix 权限。

于 2013-02-24T04:01:03.113 回答
3

一个字节为 8 位,可以用十进制(0 到 255)、八进制(000 到 377)、十六进制(00 到 FF)或二进制(00000000 到 11111111)来表示。让我们对位进行编号,从位 0 到位 7:

76543210

实际上,一个数字可以用任何基数表示,但是当要将数字分解为位时,主要是八进制和十六进制比较方便;用八进制表示一个字节更容易

 z  y  x
76543210

x是位 0 到 2,y是位 3 到 5,z是位 6 和 7。

因此,在您的示例中,017八进制数是

 0   1   7
00 001 111

以八进制(8 进制)表示的数字更容易转换为二进制。(在六边形中是0F)。

在 C (...) 中,八进制文字数字以前导零 (0...) 开头,而在十六进制中,它们以前0x导 (0x...) 开头。因为用八进制表示的数字位更容易可视化,

022 & 017

以二进制形式给出

"00 010 010" &
"00 001 111"

结果很容易找到

"00 000 010"

在十进制中,那将是18 & 15.

于 2013-02-24T04:05:10.247 回答