gpt4 book ai didi

c - 如何从二进制数中删除尾随零

转载 作者:行者123 更新时间:2023-12-05 02:53:28 25 4
gpt4 key购买 nike

我有一个 long long 类型的整数,我想在删除该整数的二进制表示中存在的尾随零后将其转换为一个新整数。

最佳答案

这是一种蛮力方法:

long long remove_trailing_zeroes(long long v) {
if (v != 0) {
while ((v & 1) == 0)
v /= 2;
}
return v;
}

这里是无符号数的直接方法,但除法可能比上面的迭代更昂贵:

unsigned long long remove_trailing_zeroes(unsigned long long v) {
if (v != 0) {
// v and (v - 1) differ only in the trailing 0 bits plus 1
// shifting v ^ (v - 1) right by 1 and adding 1 gives the power of 2
// by which to divide v to remove all trailing 0 bits
v /= (((v ^ (v - 1)) >> 1) + 1);
}
return v;
}

harold 建议进行这种简化:

unsigned long long remove_trailing_zeroes(unsigned long long v) {
if (v != 0) {
// `-v`, which is `(~v + 1)` has all bits flipped except the least
// significant 1 bit.
// dividing v by `-v & v` shifts all trailing zero bits out,
v /= -v & v;
}
return v;
}

可以简化为一个表达式:

unsigned long long remove_trailing_zeroes(unsigned long long v) {
return v ? v / (-v & v) : v;
}

为了避免除法,您可以使用一种有效的方法计算 v ^ (v - 1) 中的位数,然后将 v 右移比此小一位数字。这也适用于 0,因此您将获得无分支代码。

Bit Twiddling Hacks的精彩词中可以找到其他方法

关于c - 如何从二进制数中删除尾随零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62227706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com