这是一个非常基本的问题,我确信它有一个简单的答案,但我不知道我应该用来寻找答案的搜索词。在这里:
我正在尝试了解位掩码的工作原理。在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个?
答案 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
。