我一直在网上搜索,但还没有找到东西。
是否有内在的 C/C++ 函数将 int 的范围设置为 0 或 1?
像这样的函数:
// Modify int 'input', within range [i, j], to be either 0 or 1 based on bool 'b'.
i64 BitSetRange(i64 input, i64 i, i64 j, bool b) {
// Apply intrinsic to input ...
// ...
return input; // Result is modified input.
}
编辑:
我寻找内在函数的原因是因为我将在我正在开发的玩具高级语言的相关内在函数的实现中使用此函数。因此,我希望操作能够相当快。具体来说,我试图避免使用循环或昂贵的操作来实现结果。
最快的可能是查找表:
#define MASK(n) ((1ULL << (n)) - 1)
extern uint64_t lt[];
uint64_t f1(uint64_t val, unsigned a, unsigned b, bool v)
{
int n = b - a;
return v ? val | lt[n] : val & ~lt[n];
}
f1:
sub edx, esi
movsx rdx, edx
mov rax, QWORD PTR lt[0+rdx*8]
mov rdx, rdi
or rdx, rax
not rax
and rax, rdi
test cl, cl
cmovne rax, rdx
ret
查表:
uint64_t lt[] =
{
MASK( 1),
MASK( 2),
MASK( 3),
MASK( 4),
MASK( 5),
MASK( 6),
MASK( 7),
MASK( 8),
MASK( 9),
MASK(10),
MASK(11),
MASK(12),
MASK(13),
MASK(14),
MASK(15),
MASK(16),
MASK(17),
MASK(18),
MASK(19),
MASK(20),
MASK(11),
MASK(12),
MASK(13),
MASK(14),
MASK(15),
MASK(16),
MASK(17),
MASK(18),
MASK(19),
MASK(20),
MASK(21),
MASK(22),
MASK(23),
MASK(24),
MASK(25),
MASK(26),
MASK(27),
MASK(28),
MASK(29),
MASK(30),
MASK(31),
MASK(32),
MASK(33),
MASK(34),
MASK(35),
MASK(36),
MASK(37),
MASK(38),
MASK(39),
MASK(40),
MASK(41),
MASK(42),
MASK(43),
MASK(44),
MASK(45),
MASK(46),
MASK(47),
MASK(48),
MASK(49),
MASK(50),
MASK(51),
MASK(52),
MASK(53),
MASK(54),
MASK(55),
MASK(56),
MASK(57),
MASK(58),
MASK(59),
MASK(60),
MASK(61),
MASK(62),
MASK(63),
~0ULL,
};