gpt4 book ai didi

c - 位操作和标志

转载 作者:行者123 更新时间:2023-11-30 14:49:48 26 4
gpt4 key购买 nike

https://i.imgur.com/VU56Rwn.png

答:当 open 的手册页显示: 指定的标志是通过或运算以下值形成的:

       O_RDONLY        open for reading only
O_WRONLY open for writing only
...

这意味着我们应该在标志之间使用逻辑或,如下所示:O_RDONLY || O_WRONLY 指定我们想要的权限组合。

B:为了指示不同的选项,我们使用位标志(而不是字符或整数)以节省空间。

C:对位标志执行操作速度很快。

D:系统调用中使用的位标志在库文件中定义。

E:命令 chmod 使用八进制定义的位标志常量,因为有八种可能的权限状态。

我知道如果它是一个好的系统库,则库文件中不会定义位标志。它们通常是 header 中的常量或#defines,而不是编译对象(如果这是“库文件”所指的内容)。但是,我不明白它们如何节省空间,位标志不就是整数吗?

最佳答案

首先,||| 是不同的运算符。

| 是逐位 OR 运算符,它对每一位执行 OR 操作,您将得到结果。

|| 是逻辑 OR 运算符,如果左侧为 true 则返回 true 或右边为真,否则为假。

如果是位标志,您应该使用|,例如O_RDONLY | O_WRONLY

B: To indicate different options we use bit flags (rather than characters or integers) in order to save space.

老实说,我认为这个措辞有点误导。美好的事情关于位标志,你可以打包在一个 int 中,大部分是 32 位长,向上32 个具有 ON/OFF 语义的不同值。所以函数需要这种选项,只需要使用一个int来获取多个选项来自调用者,因为单个位代表这样的开/关属性。如果位为 1,则属性为 ON,否则为 OFF。

在构造中,当您不使用位标志时,该函数必须采用每个选项都有单独的变量,如果你有很多选项,你需要函数声明中有很多变量。所以你可以“节省空间”,如果你请改用位标志。

考虑一下:

// lot's of other has_property_x cases

int somefunc(int has_property_a, int has_property_b, int has_property_c, ...)
{
if(has_property_a)
do_something_based_on_a();
if(has_property_b)
do_something_based_on_b();
....
}

void foo(void)
{
somefunc(1, 1, 0, 1, 1);
}

这不是很高效,很难阅读,编码很痛苦, 总体来说不是一个好的设计。

但是,如果您使用位标志,则可以在函数中保存大量变量:

// lot's of other HAS_PROPERTY_X cases

#define HAS_PROPERTY_A 1
#define HAS_PROPERTY_B 2
#define HAS_PROPERTY_C 4
...

int somefunc(int flags)
{
if(flags & HAS_PROPERTY_A)
do_something_based_on_a();
if(flags & HAS_PROPERTY_B)
do_something_based_on_b();
...
}

void foo(void)
{
somefunc(HAS_PROPERTY_A | HAS_PROPERTY_B | HAS_PROPERTY_E);
}

更加紧凑和可读。

关于c - 位操作和标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49353209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com