回答
不適用於底片。
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;
}
非常感謝! :) 我現在可以按照我最初的設計方式來實現算法。 :D – bobber205 2010-04-21 21:15:50
或者'do ret.push_back(x&1)while(x >> = 1);' - 這個版本返回一個0位零輸入。 – Potatoswatter 2010-04-21 23:36:54
世界上最糟糕的字節轉換到整數位:
#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>());
哇。我想知道爲什麼Perl因難以理解而獲得聲譽=) – maerics 2010-04-21 21:27:42
絕對值得一個獨享的空間@ codinghorror。 – jweyrich 2010-04-21 21:54:41
這是真實生活中的一個例子嗎? – Potatoswatter 2010-04-21 23:36:27
這裏是負數工作的版本:
string get_bits(unsigned int x)
{
string ret;
for (unsigned int mask=0x80000000; mask; mask>>=1) {
ret += (x & mask) ? "1" : "0";
}
return ret;
}
字符串可以,當然,更換通過矢量或索引比特值。
修改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;
}
Endianess可能會在第二個彈出,是吧?好吧。 – 2010-04-21 22:43:20
返回一個字符串而不是矢量,但可以很容易地更改。
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;
}
用單線解決問題並不難,但實際上有一個標準庫解決方案。
#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
- 1. 將char轉換爲整數表示c#
- 2. 將16位整數轉換爲0..100
- 3. 將位列轉換爲整數
- 4. 將整數轉換爲列表?
- 5. 將整數列表轉換爲塊
- 6. 將數字的文本表示轉換爲整數
- 7. AVX將64位整數轉換爲64位浮點數
- 8. 將NSString轉換爲整數
- 9. 將varchar轉換爲整數
- 10. 將bytearray轉換爲整數
- 11. 將BigDecimal轉換爲整數
- 12. 在Python中將二進制表示轉換爲帶符號的64位整數
- 13. 將整數指針轉換爲整數
- 14. 使用二進制將整數轉換爲過量表示法
- 15. 使用C將整數轉換爲二進制表示?
- 16. 將字符串轉換爲表示日期的整數
- 17. 如何將整數轉換爲VHDL中的二進制表示?
- 18. 將單詞的整數表示形式轉換爲字符串
- 19. 轉換爲32位整數24位整數(2S補碼)在C++
- 20. 將長整型轉換爲整數
- 21. 將輸入字符串轉換爲六位數表示形式
- 22. 將函數轉換爲lambda表示
- 23. 十進制按位轉換爲整數
- 24. 位操作轉換爲整數
- 25. 位圖轉換爲整數(安卓)
- 26. 如何將整數列表轉換爲整數?
- 27. 將長整數列表轉換爲整數
- 28. 將整數轉換爲數組數字
- 29. 將char的8位數轉換爲整數
- 30. 如何將字符串轉換爲32位整數數組?
我想你是指_bit_表示。 – fbrereto 2010-04-21 21:04:23
這是功課嗎? – fbrereto 2010-04-21 21:05:00
鑑於整數是一個固定的大小,爲什麼不只是使用一個簡單的數組? – 2010-04-21 21:07:57