【位操作】——获取整数变量最高位为 1 的位置

获取整数变量最高位为 1 的位置

#define BIT_HIGH_BIT(y)         (((y)&BIT(31)) ? 31 : (((y)&BIT(30)) ? 30 : (((y)&BIT(29)) ? 29 : (((y)&BIT(28)) ? 28 :     \
                                (((y)&BIT(27)) ? 27 : (((y)&BIT(26)) ? 26 : (((y)&BIT(25)) ? 25 : (((y)&BIT(24)) ? 24 :     \
                                (((y)&BIT(23)) ? 23 : (((y)&BIT(22)) ? 22 : (((y)&BIT(21)) ? 21 : (((y)&BIT(20)) ? 20 :     \
                                (((y)&BIT(19)) ? 19 : (((y)&BIT(18)) ? 18 : (((y)&BIT(17)) ? 17 : (((y)&BIT(16)) ? 16 :     \
                                (((y)&BIT(15)) ? 15 : (((y)&BIT(14)) ? 14 : (((y)&BIT(13)) ? 13 : (((y)&BIT(12)) ? 12 :     \
                                (((y)&BIT(11)) ? 11 : (((y)&BIT(10)) ? 10 : (((y)&BIT(9)) ? 9 : (((y)&BIT(8)) ? 8 :         \
                                (((y)&BIT(7)) ? 7 : (((y)&BIT(6)) ? 6 : (((y)&BIT(5)) ? 5 : (((y)&BIT(4)) ? 4 :             \
                                (((y)&BIT(3)) ? 3 : (((y)&BIT(2)) ? 2 : (((y)&BIT(1)) ? 1 : (((y)&BIT(0)) ? 0 : 32          \
                                ))))))))))))))))))))))))))))))))
  • 这个宏的参数是一个整数变量 y 。
  • 宏中使用了条件运算符,通过位操作来判断 y 中最高位为 1 的位置。
  • 宏中使用了 BIT() 宏,它表示一个位为 1 的掩码。例如 BIT(31) 表示第 31 位为 1 的掩码。
  • 宏中的嵌套条件运算符会逐个检查 y 的每一位,从最高位开始,一直到最低位。
  • 如果某一位为 1,则返回该位置,否则继续检查下一位。
  • 如果所有位都为 0,则返回 32,表示没有找到最高位为 1 的位置。

下面是一个示例,展示如何使用 BIT_HIGH_BIT 宏

#include <stdio.h>
 #define BIT_HIGH_BIT(y) (((y) & BIT(31))?31:(((y) & BIT(30))?30:(((y) & BIT(29))?29:(((y) & BIT(28))?28: \
                        (((y) & BIT(27))?27:(((y) & BIT(26))?26:(((y) & BIT(25))?25:(((y) & BIT(24))?24: \
                        (((y) & BIT(23))?23:(((y) & BIT(22))?22:(((y) & BIT(21))?21:(((y) & BIT(20))?20: \
                        (((y) & BIT(19))?19:(((y) & BIT(18))?18:(((y) & BIT(17))?17:(((y) & BIT(16))?16: \
                        (((y) & BIT(15))?15:(((y) & BIT(14))?14:(((y) & BIT(13))?13:(((y) & BIT(12))?12: \
                        (((y) & BIT(11))?11:(((y) & BIT(10))?10:(((y) & BIT(9))?9:(((y) & BIT(8))?8: \
                        (((y) & BIT(7))?7:(((y) & BIT(6))?6:(((y) & BIT(5))?5:(((y) & BIT(4))?4: \
                        (((y) & BIT(3))?3:(((y) & BIT(2))?2:(((y) & BIT(1))?1:(((y) & BIT(0))?0:32 \
                        ))))))))))))))))))))))))))))))
 #define BIT(n) (1 << (n))
int main()
{
    
    
    int num = 10;  /* 二进制表示为 00000000000000000000000000001010 */
    int highestBit = BIT_HIGH_BIT(num);
    printf("最高位的位置:%d\n", highestBit);
    return 0;
}

在这个示例中, BIT_HIGH_BIT 宏被用于计算变量 num 的最高位为 1 的位置。根据二进制表示, num 的最高位为 1 的位置是第 3 位,因此输出的结果为 最高位的位置:3

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/131949078