我想設置一個整數位,但不創建位掩碼來幫助我。如何在不使用位掩碼的情況下在整數中設置位
例子:A = 128和MASC = 00000001 ...如何與位掩碼做一個& MASC = 10000001
例子:
int y,masc;
int a=128;
masc=0x01;
y=a|masc;
cout<<y;
現在的問題是:有一種沒有位掩碼的方法,如果可能的話縮短這個代碼?
我想設置一個整數位,但不創建位掩碼來幫助我。如何在不使用位掩碼的情況下在整數中設置位
例子:A = 128和MASC = 00000001 ...如何與位掩碼做一個& MASC = 10000001
例子:
int y,masc;
int a=128;
masc=0x01;
y=a|masc;
cout<<y;
現在的問題是:有一種沒有位掩碼的方法,如果可能的話縮短這個代碼?
你可以嘗試這樣的
#define SET_BIT(data, bit) (data) |= 1 << (bit);
使用宏
int num = 0;
SET_BIT(num, 2); // num = 4
有許多這樣不同的方式,但它的棘手提供了一個「好」的解決方案,而不知道爲什麼簡單地使用一個位掩碼是一個問題。例如,你可以使用的線沿線的一個輔助功能:
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
這樣 - 可能是使用位集來實現類似的工作:
#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當然是要定了位, 。我將把這部分練習留給你。
請顯示一些真實的代碼。 –
@MichaelWalz我把它塑造成一個小小的形狀。 – Magisch
'y = a | mask'有什麼問題?這已經很短了。 –