C/C++求出最低比特位的位置的宏

本文详细解析了一组用于64位整数的宏定义,这些宏能够高效地查找并返回整数最低位的比特位置。通过一系列的条件移位和加法操作,宏定义实现了对不同位数的整数进行处理,最终确定最低有效位的具体位置。当输入值为0时,宏将返回64,作为特殊处理。文章提供了完整的宏定义代码,并指出了需要包含的头文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define HASLOWBITS(x, y) ((x) & ((1ULL << (y)) - 1))
#define CONDSHR(x, y) (HASLOWBITS(x, y) ? (x) : (x) >> (y))
#define CONDADD(x, y) (HASLOWBITS(x, y) ? 0 : (y))
#define CONDSHR32(x) CONDSHR(x, 32)
#define CONDSHR48(x) CONDSHR(CONDSHR32(x), 16)
#define CONDSHR56(x) CONDSHR(CONDSHR48(x), 8)
#define CONDSHR60(x) CONDSHR(CONDSHR56(x), 4)
#define CONDSHR62(x) CONDSHR(CONDSHR60(x), 2)
#define CONDADD32(x) CONDADD(x, 32)
#define CONDADD48(x) CONDADD32(x) + CONDADD(CONDSHR32(x), 16)
#define CONDADD56(x) CONDADD48(x) + CONDADD(CONDSHR48(x), 8)
#define CONDADD60(x) CONDADD56(x) + CONDADD(CONDSHR56(x), 4)
#define CONDADD62(x) CONDADD60(x) + CONDADD(CONDSHR60(x), 2)
#define CONDADD63(x) CONDADD62(x) + CONDADD(CONDSHR62(x), 1)

// FIRSTSIGN(x) unfold to the position of the lowest bit of x
#define FIRSTSIGN(x) (x ? CONDADD63((uint64_t)x) : 64)

FIRSTSIGN(x)的值会被展开为x的最低比特位的位置,最高支持64位整数,若x为0,则展开为64.

宏定义中使用了uint64_t类型,因此需要包含头文件。
C头文件:

#include <stdint.h>

C++头文件:

#include <cstdint>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值