我是位移位和c++的新手。
假设我有一个uint8_t 00100100(36),我想检查是否设置了第3位。 以下是我现在如何做到这一点的代码,只需要一点时间。uint8_t x = 36; if(x&1<<3) printf("is set");
如何检查是否设置了第3位或第6位?我想检查几种位的组合,如第5位、第7位或第8位。
最优雅的方式是什么?
我是位移位和c++的新手。
假设我有一个uint8_t 00100100(36),我想检查是否设置了第3位。 以下是我现在如何做到这一点的代码,只需要一点时间。uint8_t x = 36; if(x&1<<3) printf("is set");
如何检查是否设置了第3位或第6位?我想检查几种位的组合,如第5位、第7位或第8位。
最优雅的方式是什么?
按数字位置校验位是正确的方法之一,但这会使代码依赖于幻数,从而增加读取和维护的难度。
通常,在检查位掩码时,目标是检查某个特定标志,例如硬件寄存器。
例如,假设整数的每一位都代表您房子中的一个特定灯光,并且您想要检查浴室和厨房是否打开:
enum LightMask { ENTRANCE = 0x01, LIVING_ROOM = 0x02, RESTROOM = 0x04, KITCHEN = 0x08, BATHROOM = 0x10, BEDROOM1 = 0x20, BEDROOM2 = 0x40, ATTIC = 0x80 }; uint8_t lightsOn = GetLightsOn(); if (lightsOn & (BATHROOM | KITCHEN)) { // ... }
这很优雅,易于理解,并且可以很容易地进行修改。
如果您想显式地使用位位置而不是常量,也可以用位移位来表示枚举,而不会对编译器产生任何影响:
enum LightMask { ENTRANCE = 1 << 0, LIVING_ROOM = 1 << 1, RESTROOM = 1 << 2, KITCHEN = 1 << 3, BATHROOM = 1 << 4, BEDROOM1 = 1 << 5, BEDROOM2 = 1 << 6, ATTIC = 1 << 7 };
这篇关于如何获取第n位值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持前端之家!