可能重複:
C/C++ check if one bit is set in, i.e. int variable如何檢查C++中某個變量的某些位?
例如如果我有一個整數,我想檢查20-25位的值是什麼,或者如果我只是想檢查其中一個位是0還是1,我該怎麼做?
可能重複:
C/C++ check if one bit is set in, i.e. int variable如何檢查C++中某個變量的某些位?
例如如果我有一個整數,我想檢查20-25位的值是什麼,或者如果我只是想檢查其中一個位是0還是1,我該怎麼做?
int bitsToInt(int value, int s, int e) {
int mask = ((1 << (e - s + 1)) - 1) << s;
return (value & mask) >> s;
}
bitsToInt(7,2,3)返回1
想多一點,如果你想要的是到一個詮釋,你可以塞住幾個值做好bitfields並讓編譯器擔心掩碼和轉換。
似乎工作,我只是試圖用wiki中的信息編寫一個,與那個簡單的代碼相比,我的工作會非常糟糕。 – Kaije 2010-11-06 19:00:30
可能存在一些邊界問題(我沒有廣泛測試代碼),請小心使用。 – DennyRolling 2010-11-06 19:37:48
使用標準的邏輯運算,如邏輯與,或運算符,異或並將其與位移組合。這應該給你一些想法:http://en.wikipedia.org/wiki/Bit_manipulation
希望幫助
您可以通過使用位AND運算符做到這一點。
int x = SOME_VALUE;
// check 20-25 bits
if (x & 0x3F00000) {
// any of bits on
}
您將在整數和「掩碼」值之間使用按位與運算符,該值忽略所有其他位。因此,像這樣:
const int BIT_4 = 0x8;
// ....
int val = /* ... */;
if ((val & BIT_4) != 0)
; // Bit 4 is ON!
else
; // Bit 4 is OFF
我會說'1 << 3'而不是'0x8'。 (此外,從零開始,這是第3位,而不是第4位。) – asveikau 2010-11-06 18:54:54
uint32_t
get_bits_20_to_24(uint32_t i_)
{
union {
struct
{
uint32_t bits1 : 20;
uint32_t bits2 : 5;
uint32_t bits3 : 7;
} s;
uint32_t i;
};
i = i_;
return s.bits2;
}
我的意思是我想檢查像例如20-25位00011所以它會是3 – Kaije 2010-11-06 18:32:00
所以也許一個函數,int x = Bits2Val(y,20,25); – Kaije 2010-11-06 18:35:23