簡體   English   中英

將整數結構轉換為位掩碼

[英]Converting a struct of integers into a bitmask

是否可以(如果可以,如何)將整數結構轉換為位掩碼。 每個整數一位(如果int為0,則為0,否則為1)。 例如

struct Int_List_t
{  
    uint64_t int1;
    uint64_t int2;
    uint64_t int3;
    uint64_t int4;
} int_list={10,0,5,0};



char int_mask = somefunction(int_list); 
//Would contain 1010
                ||||
                |||+-- int4 is 0
                ||+--- int3 is not 0
                |+---- int2 is 0
                +----- int1 is not 0

您可以明確地做到這一點:

char mask(const Int_List_t& vals)
{
    return (vals.int1 ? 0x8 : 0x0) |
           (vals.int2 ? 0x4 : 0x0) |
           (vals.int3 ? 0x2 : 0x0) |
           (vals.int4 ? 0x1 : 0x0);
}

如果傳入數組而不是結構,則可以編寫循環:

template <size_t N>
uint64_t mask(uint64_t (&vals)[N])
{
    uint64_t result = 0;
    uint64_t mask = 1 << (N - 1); 
    for (size_t i = 0; i < N; ++i, mask >>= 1) {
        result |= (vals[i] ? mask : 0); 
    }   
    return result;
}

如果您願意完全繞過任何類型安全,甚至可以通過將對象重新解釋為指針來實現上述目的,盡管我不一定會推薦它:

template <typename T>
uint64_t mask(const T& obj)
{
    const uint64_t* p = reinterpret_cast<const uint64_t*>(&obj);
    const uint64_t N = sizeof(T)/8;

    uint64_t result = 0;
    uint64_t mask = 1 << (N - 1); 
    for (size_t i = 0; i < N; ++i, ++p, mask >>= 1) {
        result |= (*p ? mask : 0); 
    }   
    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM