位域及枚举位运算实例应用

Runtime:运行时做些操作
这里写图片描述

struct  {
    // 位域 :
    uintptr_t nonpointer         : 1; //用二进制的一位来代表这个信息
    uintptr_t has_assoc          : 1;
    uintptr_t has_cxx_dtor       : 1;
    uintptr_t shiftcls           : 33;//拿33位代表这个信息,一个字节是8位,这里用了33位,这里用了4个字节再加一位
    uintptr_t magic              : 6;
    uintptr_t weakly_referenced  : 1;
    uintptr_t deallocating       : 1;
    uintptr_t has_sidetable_rc   : 1;
    uintptr_t extra_rc           : 19;
};

位域的来源:
这里写图片描述

这里有三个BOOL属性,就会占3个字节,因为BOOL类型的结果要么是0要么是1,所以就会想,tall用一个二进制位来存储,rich用一个二进制位来存储,handsome用一个二进制位来存储,那么三个加起来用三个二进制位来存储就可以了,那么三个合起来只用1个字节就可以了
那么怎么实现呢:
MJPerson.h
这里写图片描述
MJPerson.m
这里写图片描述
按位与&可以取出特定位的值,只需要把要取出的那位置为1其他置为0 与上那个数值就可以了
这里写图片描述
取值操作的过程
这里写图片描述
加两个!!可以强转为BOOL类型
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
因为是宏所以应该用小括号括起来
这里写图片描述
设置过程:
按位或| ,想要某一位 置为1,是要拿到野码进行按位或就可以了
按位与,其他都为1的话,才为1,传进来为NO就是把这一位直为0,如何将某一位置为0,让这个值与上这个值的其他位都是1就那一位为0,这样就可以办到让某一位置为0,而且其他位的值还保持不变
这里写图片描述
这里写图片描述
~表示每一位取反
位运算在项目中的用法:
全部代码
MJPerson.h

#import <Foundation/Foundation.h>

@interface MJPerson : NSObject
//@property (assign, nonatomic, getter=isTall) BOOL tall;
//@property (assign, nonatomic, getter=isRich) BOOL rich;
//@property (assign, nonatomic, getter=isHansome) BOOL handsome;

- (void)setTall:(BOOL)tall;
- (void)setRich:(BOOL)rich;
- (void)setHandsome:(BOOL)handsome;

- (BOOL)isTall;
- (BOOL)isRich;
- (BOOL)isHandsome;

@end

MJPerson.m

#import "MJPerson.h"

// &可以用来取出特定的位

// 0000 0111
//&0000 0100
//------
// 0000 0100

// 掩码,一般用来按位与(&)运算的
//#define MJTallMask 1
//#define MJRichMask 2
//#define MJHandsomeMask 4

//#define MJTallMask 0b00000001
//#define MJRichMask 0b00000010
//#define MJHandsomeMask 0b00000100

#define MJTallMask (1<<0)
#define MJRichMask (1<<1)
#define MJHandsomeMask (1<<2)

@interface MJPerson()
{
    char _tallRichHansome;
}
@end

@implementation MJPerson


// 0010 1010
//&1111 1101
//----------
// 0010 1000

- (instancetype)init
{
    if (self = [super init]) {
        _tallRichHansome = 0b00000100;
    }
    return self;
}

- (void)setTall:(BOOL)tall
{
    if (tall) {
        _tallRichHansome |= MJTallMask;
    } else {
        _tallRichHansome &= ~MJTallMask;
    }
}

- (BOOL)isTall
{
    return !!(_tallRichHansome & MJTallMask);
}

- (void)setRich:(BOOL)rich
{
    if (rich) {
        _tallRichHansome |= MJRichMask;
    } else {
        _tallRichHansome &= ~MJRichMask;
    }
}

- (BOOL)isRich
{
    return !!(_tallRichHansome & MJRichMask);
}

- (void)setHandsome:(BOOL)handsome
{
    if (handsome) {
        _tallRichHansome |= MJHandsomeMask;
    } else {
        _tallRichHansome &= ~MJHandsomeMask;
    }
}

- (BOOL)isHandsome
{
    return !!(_tallRichHansome & MJHandsomeMask);
}

@end

main.m

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MJPerson *person = [[MJPerson alloc] init];
        person.rich = YES;
        person.tall = NO;
        person.handsome = NO;

        NSLog(@"tall:%d rich:%d hansome:%d", person.isTall, person.isRich, person.isHandsome);
//        person.tall = YES;
//        person.rich = YES;
//        person.handsome = NO;

//        NSLog(@"%zd", class_getInstanceSize([MJPerson class]));
    }
    return 0;
}

改进为位域
这里写图片描述
MJPerson.m的文件变为
这里写图片描述
共用体
用共用体好处:做运算的时候是位运算比较精准.
共用体的意思是大家共用一块内存
这里写图片描述
struct是增加可读性,就是将来的bits要存储三种信息tall,rich,handsome,而且顺便告诉各自占几位

枚举位运算实例应用
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值