比特移位编码效率(即整齐的技巧)

Chu*_*uck 3 c bit-manipulation objective-c bit-shift

我正在开发一个Objective-C程序,我正在通过网络获取位域,并且需要根据这些位设置布尔变量.

目前我将位域表示为int's,然后使用位移,类似于此(所有自身属性都是BOOL):

typedef enum {
    deleteFlagIndex = 0,
    uploadFlagIndex = 1,
    moveFlagIndex = 2,
    renameFlagIndex = 3
} PrivilegeFlagIndex;

int userFlag = 5; //for example

// this would be YES
self.delete = ((userFlag & (1 << deleteFlagIndex)) == (1 << deleteFlagIndex));
// this would be NO
self.upload = ((userFlag & (1 << uploadFlagIndex)) == (1 << uploadFlagIndex));
Run Code Online (Sandbox Code Playgroud)

这是有效的(据我所知),但我想知道 - 是否有一种更有效的简洁方法来编写所有使用花哨技巧/黑客的位?我问,因为我会为很多标志(超过30个)做这个.

我意识到我也可以使用这种方法:

self.move = ((userFlag & (1 << moveFlagIndex)) > 0)
Run Code Online (Sandbox Code Playgroud)

...这确实减少了打字的数量,但我不知道是否有充分的理由不这样做.

编辑:修改为简洁而不是有效 - 我并不担心执行性能,而是以聪明的方式做这件事的技巧和最佳实践.

Rud*_*uis 11

尝试:

typedef enum {
    deleteFlag = 1 << 0,
    uploadFlag = 1 << 1,
    moveFlag = 1 << 2,
    renameFlag = 1 << 3
} PrivilegeFlags;
Run Code Online (Sandbox Code Playgroud)

现在您可以|直接使用它们.

通常,只需检查0即可:

if (userFlag & deleteFlag) {
    // delete...
}
Run Code Online (Sandbox Code Playgroud)