C 獲取位操作

2021-10-23 10:31:19 字數 2166 閱讀 5526

起因

獲取某個值的指定幾位(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容器的位操作 一 傳...