c语言中 求掩码位数,目标C中的位掩码

本文讨论了枚举值在编程中的使用,建议将枚举类型直接声明,而非使用typedef。同时,提出了使用位字段来表示角色特征的方式,但指出这种方式在调试时可能存在困难。作者推荐使用NSSet替代位字段,以提高代码可读性和易用性,如添加、检查和删除特征,并展示了如何实现这一变化。此外,还提倡在变量名中添加'FlagsMask'后缀以表示位掩码,提高代码的清晰度。
摘要由CSDN通过智能技术生成

joerick..

60

我建议改变一些事情:

枚举值可以更改为左移一个.在我看来,使写作更容易一些.

您不需要将typedef设置为NSUInteger,您可以直接使用声明枚举类型typedef enum.

并且,正如其他人所提到的,您的属性不应该是指向Traits类型的指针.

我的代码看起来像这样:

typedef enum

{

TraitsCharacterHonest = 1 << 0,

TraitsCharacterOptimistic = 1 << 1,

TraitsCharacterPolite = 1 << 2,

TraitsCharacterDevious = 1 << 3,

TraitsPhysicalTall = 1 << 4,

TraitsPhysicalBeautiful = 1 << 5,

TraitsPhysicalFat = 1 << 6,

TraitsPhysicalBigEyes = 1 << 7,

TraitsPhysicalRedHair = 1 << 8

} Traits;

#import

@interface Person : NSObject

@property (strong, nonatomic) NSString *name;

@property (assign, nonatomic) Traits traits;

@end

设置John的特征将如下所示:

Person *john = [[Person alloc] init];

john.traits = TraitsCharacterHonest | TraitsCharacterOptimistic | TraitsPhysicalBeautiful;

然而,虽然位字段对于学习很有用,但是调试它们真的很痛苦.如果你现在想要打印这个角色的特征,你必须编写如下代码:

NSMutableString *result = [NSMutableString string];

if (self.traits & TraitsCharacterHonest)

{

[result appendString: @"Honest, "];

}

if (self.traits & TraitsCharacterOptimistic)

{

[result appendString: @"Optimistic, "];

}

if (self.traits & TraitsCharacterPolite)

{

[result appendString: @"Polite, "];

}

// etc...

此外,删除特征等操作的语法令人困惑.你必须使用&和一个NOT-ed常数,

// remove 'Tall' trait

john.traits = john.traits & ~TraitsPhysicalTall

如果可以(并且性能不是太大的问题),我更喜欢使用更高级别的功能.也许是一个带字符串常量的NSSet?例如

__unused static NSString *TraitsCharacterHonest = @"TraitsCharacterHonest";

__unused static NSString *TraitsCharacterOptimistic = @"TraitsCharacterOptimistic";

__unused static NSString *TraitsCharacterPolite = @"TraitsCharacterPolite";

// etc...

@interface Person : NSObject

@property (strong, nonatomic) NSString *name;

@property (assign, nonatomic) NSMutableSet *traits;

@end

然后你可以这样做:

// adding

[john.traits addObject: TraitsCharacterHonest];

// checking

[john.traits containsObject: TraitsCharacterHonest];

// removing

[john.traits removeObject: TraitsCharacterHonest];

对我来说更有意义.更重要的是,您可以直接打印特征的描述

NSLog(@"John's traits: %@", john.traits);

你会得到合理的输出.

我还建议在每个变量上加上一个'FlagsMask`后缀,表示该变量有一个位(或者如果你把它们组合起来......'BoldItalicTraitsMask =`BoldTraitsMask | ItalicTraitsMask`),可以用作掩码. (2认同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值