为什么在位掩码中使用十进制数?

时间:2013-02-24 03:56:59

标签: c bit-manipulation

这是一个非常基本的问题,我确信它有一个简单的答案,但我不知道我应该用来寻找答案的搜索词。在这里:

我正在尝试了解位掩码的工作原理。在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个?

2 个答案:

答案 0 :(得分:4)

以前导0开头的数字是八进制数 - 这是标准的C语法。

这些对于位掩码非常有用,尤其是代表Unix权限。

答案 1 :(得分: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-base)表示的数字更容易转换为二进制。 (在hexa中为0F)。

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

022 & 017

给出二进制

"00 010 010" &
"00 001 111"

结果很容易找到

"00 000 010"

十进制,即18 & 15