2011-09-20 13 views
2

例如,我希望有一個位列表,可以在列表的一部分上執行數學運算。作爲數字的C++位列表

value: 864 
as bits, pos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 
as bits, value: 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 

如果我把位1到4和6到9我得到0,1,1,0,1,0,0,0(104)。然後,如果我加3,它就變成了0,1,1,0,1,0,1,1(107)。 (xor(data [n],data [n2])){}這個代碼看起來像這樣的事情,數據[n - 1] ==假;}等...

我甚至可以使用POD數組,但我想,C++是如此接近計算機的內部往往是沒有幫助,但在這裏,它可能允許這個操作非常迅速地完成。

類似於將值存儲在一個大的POD變量或數組中,然後將它們複製到另一個變量的內存中,以便在將它們複製回存儲器中的位置之前完成數學運算?

更好的情況下,例如加法運算符能否以某種方式將內存中的該位置作爲參數直接添加到數據存儲中間?

+3

聽起來你想要一個'int'! – mydogisbox

+0

1到4和6到9(1,2,3,4,6,7,8,9)只是一個例子,它可能是我需要能夠執行操作的任何段。 – alan2here

+0

我不確定自己完全掌握了自己想要的內容,但根據我的理解,您最好的選擇是將您的數據複製到「int」中或者就地執行布爾邏輯。直接引用位數組的問題是數組中的特定位不總是與字節的開頭對齊。 – mydogisbox

回答

1

可能的快速方式不起作用,並且會受到限制。

unsigned int n = 8; 
unsigned short *p1, *p2; 
p1 = reinterpret_cast<unsigned short*>(&n); 
p2 = reinterpret_cast<unsigned short*>((&n)+1); 
std::cout<<*p1<<", "<<*p2<<std::endl; 

下面是完整的解決方案,感謝信息,讓我完成這一點。它可以輕鬆地重新使用std :: vector來代替。

#include <math.h> // for pow in weighted_random_UINT 
#include <bitset> // or std::vector<bool> 

template <std::size_t T> // this line is not required with std::vector 
unsigned int get_chunk(std::bitset<T>* btset, unsigned int start, unsigned int end) 
{ 
    unsigned long out = 0; 
    for(unsigned int n = start; n < end; n++) 
    { 
     out += unsigned long((*btset)[n] * pow(2,double(n-start))); 
    } 
    return out; 
} 

void main() 
{ 
    // 6 bits of data in reverse order 
    std::bitset<6> data (std::string("000110")); 

    // all the data numerically 
    std::cout<<get_chunk<6>(&data,0,5)<<std::endl; 

    // the first 3 bits as a number 
    std::cout<<get_chunk<6>(&data,0,2)<<std::endl; 

    // the last 3 bits as a number 
    std::cout<<get_chunk<6>(&data,3,5)<<std::endl; 
} 
+2

'* pow(2,double(n-start))'......天啊,不。問題是要求有效的解決方案! – bitmask

+0

隨意改善我自己的答案。 – alan2here

1

聽起來像是你想BoostDynamicBitset

dynamic_bitset class表示一組比特。它提供了通過operator[]訪問各個位的值,並提供了可應用於內置整數的所有按位運算符,如operator&operator<<。該集合中的位數通過參數dynamic_bitset的構造函數在運行時指定。

+0

我認爲我更喜歡std :: bitset,這是我以前不知道的。這似乎是一個類似的,但可能prefrable解決方案使用一個布爾數組。它似乎不允許我從bitset內部選擇一個部分,並對其執行諸如加法之類的操作,儘管如果該部分長度超過1位而不必將其複製到其他長途中。 – alan2here

+0

我不認爲_processor_能夠對一些(複數)位進行任意操作。操作通常是在外部進行,然後屏蔽回原點。 –

+0

對不起,自己寫了一個完整的答案,但是對於這個信息。 – alan2here