起因
獲取某個值的指定幾位(bit)
例如:整數89,它的二進位制是1011001。這時我需要獲取從該二進位制從右開始第3位到5位的二進位制,並轉換位10進製。那麼如何操作呢?有人說可以按位左移並右移得到,ok 理論這完全可以,但你可以試試,會出錯!因為整數89,你並沒有告訴系統這個值是什麼型別,所以系統按照4位元組處理時,你就不能用程式來控制移動了。ok,這裡我們給出驗證過的c++程式。
程式
#include
"iostream"
#include
"stdlib.h"
// 字串轉int
#define str2int(value) atoi(value)
#define debug 0
unsigned
int_bit_
(const
unsigned
int&value,
const
unsigned
short
&start,
const
unsigned
short
&length)
else
if(value <=
65535
)#if debug
std::cout <<
"bitcnt:"
<< bitcnt << std::endl;
#endif
// 計算左移步長
unsigned
short movecnt = bitcnt -
(start + length)
;#if debug
std::cout <<
"movecnt1:"
<< movecnt << std::endl;
#endif
// 開始左移
unsigned
int tmp =0;
tmp =
(value << movecnt)
;#if debug
std::cout <<
"tmp1:"
<< tmp << std::endl;
#endif
// 開始&
tmp =
(tmp & y)
;#if debug
std::cout <<
"tmp2:"
<< tmp << std::endl;
#endif
// 計算右移步長
movecnt = movecnt + start;
#if debug
std::cout <<
"movecnt2:"
<< movecnt << std::endl;
#endif
// 開始右移
tmp =
(tmp >> movecnt)
;#if debug
std::cout <<
"t***:"
<< tmp << std::endl;
#endif
return tmp;
}int
main
(int argc,
char
**ar**)
#else
std::cout <<
_bit_(89
,1,5
)<< std::endl;
// 12
#endif
/* unsigned short value = 89;
std::cout << (value << 2) << std::endl;
tmp = (value << 2);
tmp = tmp & 0xff;
std::cout << tmp << std::endl;
tmp = (tmp >> 3);
std::cout << tmp << std::endl;
*/return0;
}
關注筆者 - jxd重溫位操作 C 位操作介紹
c 位操作包括兩種 傳統的c語言方式的位操作和c 中利用bitset容器的位操作 一 傳統的c方式位操作 1.基本操作 使用乙個unsigned int變數來作為位容器。2.操作符 按位或操作符 result exp1 exp2 當exp1和exp2中對應位中至少有乙個為1時,result中對應位為...
C語言位操作
在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來 完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功 能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算...
C 位操作介紹
很多基礎的東西都忘記差不多了,昨天跟新公司的主管討論乙個加密工具的開發,他提到使用按位抑或是可逆運算,我還跟他爭論 我把抑或理解成按位或了 後來一身冷汗,這麼基礎的東西都忘記了,枉我號稱c程式設計師,可惜可惜啊 c 位操作包括兩種 傳統的c語言方式的位操作和c 中利用bitset容器的位操作 一 傳...