2010-04-21 81 views
13

如何將整數轉換爲其位表示形式。我想要一個整數並返回一個包含1和0的整數位表示的向量。將整數轉換爲位表示

我有一段時間試圖做到這一點,所以我想我會問,看看是否有內置的庫函數可以幫助。

+2

我想你是指_bit_表示。 – fbrereto 2010-04-21 21:04:23

+5

這是功課嗎? – fbrereto 2010-04-21 21:05:00

+0

鑑於整數是一個固定的大小,爲什麼不只是使用一個簡單的數組? – 2010-04-21 21:07:57

回答

13

不適用於底片。

vector<int> convert(int x) { 
    vector<int> ret; 
    while(x) { 
    if (x&1) 
     ret.push_back(1); 
    else 
     ret.push_back(0); 
    x>>=1; 
    } 
    reverse(ret.begin(),ret.end()); 
    return ret; 
} 
+0

非常感謝! :) 我現在可以按照我最初的設計方式來實現算法。 :D – bobber205 2010-04-21 21:15:50

+3

或者'do ret.push_back(x&1)while(x >> = 1);' - 這個版本返回一個0位零輸入。 – Potatoswatter 2010-04-21 23:36:54

0

世界上最糟糕的字節轉換到整數位:

#include <algorithm> 
#include <functional> 
#include <iterator> 
#include <stdlib.h> 

class zero_ascii_iterator: public std::iterator<std::input_iterator_tag, char> 
{ 
public: 
    zero_ascii_iterator &operator++() 
    { 
     return *this; 
    } 

    char operator *() const 
    { 
     return '0'; 
    } 
}; 


char bits[33]; 

_itoa(value, bits, 2); 
std::transform(
    bits, 
    bits + strlen(bits), 
    zero_ascii_iterator(), 
    bits, 
    std::minus<char>()); 
+3

哇。我想知道爲什麼Perl因難以理解而獲得聲譽=) – maerics 2010-04-21 21:27:42

+0

絕對值得一個獨享的空間@ codinghorror。 – jweyrich 2010-04-21 21:54:41

+0

這是真實生活中的一個例子嗎? – Potatoswatter 2010-04-21 23:36:27

2

這裏是負數工作的版本:

string get_bits(unsigned int x) 
{ 
    string ret; 
    for (unsigned int mask=0x80000000; mask; mask>>=1) { 
    ret += (x & mask) ? "1" : "0"; 
    } 
    return ret; 
} 

字符串可以,當然,更換通過矢量或索引比特值。

3

修改DCP的答案。行爲是爲t的負值定義的實現。它提供所有位,甚至是前導零。與使用std::vector<bool>相關的標準警告,它不是一個合適的容器。

#include <vector> //for std::vector 
#include <algorithm> //for std::reverse 
#include <climits> //for CHAR_BIT 

template<typename T> 
std::vector<bool> convert(T t) { 
    std::vector<bool> ret; 
    for(unsigned int i = 0; i < sizeof(T) * CHAR_BIT; ++i, t >>= 1) 
    ret.push_back(t & 1); 
    std::reverse(ret.begin(), ret.end()); 
    return ret; 
} 

還有一個版本,[可能]與浮點值一起工作。可能還有其他POD類型。我沒有真正測試過。它可能對負值有更好的效果,或者它可能會變得更糟。我沒有太多考慮。

template<typename T> 
std::vector<bool> convert(T t) { 
    union { 
    T obj; 
    unsigned char bytes[sizeof(T)]; 
    } uT; 
    uT.obj = t; 

    std::vector<bool> ret; 
    for(int i = sizeof(T)-1; i >= 0; --i) 
    for(unsigned int j = 0; j < CHAR_BIT; ++j, uT.bytes[i] >>= 1) 
     ret.push_back(uT.bytes[i] & 1); 
    std::reverse(ret.begin(), ret.end()); 
    return ret; 
} 
+0

Endianess可能會在第二個彈出,是吧?好吧。 – 2010-04-21 22:43:20

1

返回一個字符串而不是矢量,但可以很容易地更改。

template<typename T> 
std::string get_bits(T value) { 
    int size = sizeof(value) * CHAR_BIT; 
    std::string ret; 
    ret.reserve(size); 
    for (int i = size-1; i >= 0; --i) 
     ret += (value & (1 << i)) == 0 ? '0' : '1'; 
    return ret; 
} 
6

用單線解決問題並不難,但實際上有一個標準庫解決方案。

#include <bitset> 
#include <algorithm> 

std::vector<int> get_bits(unsigned long x) { 
    std::string chars(std::bitset< sizeof(long) * CHAR_BIT >(x) 
     .to_string< char, std::char_traits<char>, std::allocator<char> >()); 
    std::transform(chars.begin(), chars.end(), 
     std::bind2nd(std::minus<char>(), '0')); 
    return std::vector<int>(chars.begin(), chars.end()); 
} 

C++ 0x甚至使它更容易!

#include <bitset> 

std::vector<int> get_bits(unsigned long x) { 
    std::string chars(std::bitset< sizeof(long) * CHAR_BIT >(x) 
     .to_string(char(0), char(1))); 
    return std::vector<int>(chars.begin(), chars.end()); 
} 

這是圖書館更離奇的角落之一。也許真的是他們駕駛的是序列化。

cout << bitset<8>(x) << endl; // print 8 low-order bits of x