簡體   English   中英

如何在不使用位掩碼的情況下在整數中設置位

[英]How to set a Bit in an Integer without using a bitmask

我想在整數上設置一個位,但不創建位掩碼來幫助我。

示例:a = 128並且masc = 00000001 ... a&masc = 10000001

使用位掩碼的示例:

int y,masc;
int a=128;
masc=0x01;
y=a|masc;
cout<<y;

現在的問題是: 是否有一種方法可以在沒有位掩碼的情況下做到這一點?

有許多不同的方法可以做到這一點,但是要提供“更好”的解決方案卻不知道為什么僅使用位掩碼會帶來問題是很棘手的。 例如,您可以按照以下方式使用輔助功能:

template< typename BITS> inline BITS set_bit(BITS data, size_t pos, bool val)
{
    return ( val ) ? data | ( 1 << pos ) : data & ~ ( 1 << pos );
}

unsigned int a = 128;
a = set_bit(a, 0, true);
std::cout << a << std::endl;   // gives 129 = 10000001
a = set_bit(a, 4, true);
std::cout << a << std::endl;   // gives 145 = 10010001
a = set_bit(a, 7, false);
std::cout << a << std::endl;   // gives 17  = 00010001

(請注意,我尚未在pos參數上對此添加任何邊界檢查)

另一種方法是使用位域 ,該位域允許您為較大類型的單個位和位組聲明變量名稱,如下所示:

struct MyBits {
    unsigned int alpha : 1,
                 beta : 1,
                 gamma : 1;
};

MyBits b;
b.alpha = 1;
b.gamma = 1;

std::cout << b.alpha << std::endl;  // gives 1
std::cout << b.beta << std::endl;   // gives 0
std::cout << b.gamma << std::endl;  // gives 1

第三種方式-雖然這不是嚴格使用int這樣-可能是使用一個bitset來實現類似的工作:

#include <bitset>

std::bitset<8> c;
c[0] = true;
c[2] = true;

std::cout << c[0] << std::endl; // gives 1
std::cout << c[1] << std::endl; // gives 0
std::cout << c[2] << std::endl; // gives 1

都有其優點和缺點。 這很大程度上取決於您提出問題的動機。

在C ++(和一般的計算機)中,您有兩種類型的運算:數字運算和位運算。 由於要避免使用后者,因此必須使用前者。

幸運的是,位和數字之間存在簡單的關聯。 整數中的位對應於2的冪。 最低位代表2 ^ 0 = 1,下一位代表2 ^ 1 = 2等。

我們需要從兩個的最高冪開始:

int p2 = (INT_MAX - INT_MAX/2);

然后復制每個設置的位:

int result = 0
while (p2 > 0)
{
    if (a>p2) // This bit is set in a2, copy it.
    {
         result += p2;
         a -= p2;
    }
    p2 /= 2;
}

當然,除了要設置p2時。 我將把練習的那部分留給您。

您可以嘗試這樣的宏

#define SET_BIT(data, bit) (data) |= 1 << (bit);    

用法

int num = 0;
SET_BIT(num, 2);    // num = 4

暫無
暫無

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

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