2012-04-27 476 views
3

給定一個整數,如何去除二進制表示中的前導零?在C/C++中除去二進制數中的前導零0

我正在使用按位運算符來操作它的二進制表示。我試圖看看一個整數是否是二進制表示中的迴文。我知道有不同的解決方案,但我想比較第一位和最後一位,第二位和最後一位,等等。所以,我想知道如何去掉這個int的前導0。

+7

也許一個愚蠢的questio ñ,但你如何得到它的二進制表示? – user7116 2012-04-27 01:45:40

+0

使用按位運算符來操作其二進制表示。我試圖看看一個整數是否是二進制表示中的迴文。我知道有不同的解決方案,但我想比較第一位和最後一位,第二位和最後一位,等等。所以,我想知道如何去掉這個int的前導0。 – Bugaboo 2012-04-27 01:51:59

+0

您可以嘗試將其轉換爲字符串並使用'std :: string :: find_first_not_of'。 – chris 2012-04-27 01:54:41

回答

2

您可以使用BitScanForwardBitScanReverse(確切名稱因編譯器而異),以便從任何一方有效地修剪(以及跳過處理)零。

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; 
+0

'0x07C4ACDDU'你能引用你的來源嗎? – ildjarn 2012-04-27 04:25:40

+0

當然,請點擊帖子中的鏈接... – user7116 2012-04-27 05:30:11

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; 
+0

我認爲這個效果非常不好。 – 2014-06-14 07:29:51

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); 
    ...