设置按位范围[关闭]

问题描述 投票:0回答:1

我一直在网上搜索,但还没有找到东西。

是否有内在的 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.
}

编辑:

我寻找内在函数的原因是因为我将在我正在开发的玩具高级语言的相关内在函数的实现中使用此函数。因此,我希望操作能够相当快。具体来说,我试图避免使用循环或昂贵的操作来实现结果。

c++ c x86
1个回答
0
投票

最快的可能是查找表:

#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,
};
© www.soinside.com 2019 - 2024. All rights reserved.