用C / C ++中的二进制数去掉前导零

时间:2012-04-27 01:44:17

标签: c++ c binary

给定一个整数,如何从其二进制表示中去除前导零?

我使用逐位运算符来操纵其二进制表示。我试图看一个整数是否是其二进制表示中的回文。我知道有不同的解决方案,但我想比较第一位和最后一位,第二位和最后一位,但是一位,依此类推。所以,我想知道如何剥离这个int的前导0。

4 个答案:

答案 0 :(得分:2)

您可以使用BitScanForwardBitScanReverse(确切的名称因编译器而异)从任意一侧有效地修剪(好,跳过处理)零。

答案 1 :(得分:1)

您可以通过查找log base 2 of the number

找到第一位
/* from Bit Twiddling Hacks */
static const unsigned int MultiplyDeBruijnBitPosition[32] = 
{
    0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
    8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

uint32_t pos = value;
pos |= pos >> 1;
pos |= pos >> 2;
pos |= pos >> 4;
pos |= pos >> 8;
pos |= pos >> 16;
pos = MultiplyDeBruijnBitPosition[(uint32_t)(pos * 0x07C4ACDDU) >> 27];

或者如果您需要面具,只需调整finding the next power of 2

/* adapted from Bit Twiddling Hacks */
uint32_t mask = value - 1;
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;

答案 2 :(得分:1)

如果您不介意使用字符串并且性能不是问题,您可以这样做:

    #include <bitset>
    #include <string>
    using namespace std;

    // your number
    int N;
    ...

    // convert to a 32 bit length binary string
    string bitstr = bitset<32>(N).to_string();

    // get the substring
    int index = 0;
    string strippedstr;
    for(unsigned int i = 0; i < bitstr.length(); ++i) {
        if(bitstr[i] == '1') {
            index = i;
            break;
        }
    }
    strippedstr = bitstr.substr(index);
   ...

答案 3 :(得分:0)

以下是How to check if the binary representation of an integer is a palindrome?

中发布的答案

首先使用此功能反转位:

/* flip n */
unsigned int flip(unsigned int n)
{
    int i, newInt = 0;
    for (i=0; i<WORDSIZE; ++i)
    {
        newInt += (n & 0x0001);
        newInt <<= 1;
        n >>= 1;
    }
    return newInt;
}

然后删除尾随零:

int flipped = flip(n);
/* shift to remove trailing zeroes */
while (!(flipped & 0x0001))
    flipped >>= 1;

要回答关于检查int是否是回文的评论,只需将比特移位的翻转版本与原始版本进行比较:

return n == flipped;