位運算之指定位操作
阿新 • • 發佈:2019-01-27
# 題目: 實現對一個8Bit資料(unsigned char型別)的指定位(例如第n位)的置0或者置1操作,並保持其他位變。
@ 函式原型:unsigned char _operator_bit(unsigned char data, int pos, int flag); @題目分析:運用 移位運算子(>>),按位取反(~),按位與(&),按位或(|)等運算子; /* @思路分析: 想要只改變bit位的某一位,例如:0000 0011 想要把第3位變成1,那麼我們只需要 給第三位或上一個1就可以了,變成:0000 0111;那麼如果想要把第2位變成0, 那麼我們只要 給第二位與上一個 0,變成:0000 0001;就可以了; 這就要用到我們熟悉的位運算子了; 首先我們想到的最簡單的就是用定義一個1去與元資料進行位操作運算; 那麼,我們試一下;0000 0011 要把第三位變成1,那麼 0000 00001 就得先向左移動2位變成: 0000 0100;然後和 0000 0011 進行按位或 就得到結果;0000 0111 ;而如果是把第二位的1變成0, 把:0000 0011 變成0000 0001, 那麼,繼續和第一次的操作一樣的話,0000 0001 左移一位,變成 0000 0010,和0000 0011 按位或得到 0000 0011,沒有變化,那麼就有問題了,我們再試試,將 0000 0010 按位取反:1111 1101,再與 0000 0011 按位與得到:0000 0001,就是我們想要的結果了; 好了,嘴上的功夫完了,下面就是手底下的功夫了; */ # 演算法流程圖:#include<stdio.h> #include<stdlib.h> #include<assert.h> unsigned int _operator_bit(unsigned char data, int pos, int flag) { int op = 1; //if(pos < 1 || pos > 8) // return ; if判斷的話返回值不好弄,那就直接用assert函式; assert(pos>=1 && pos<=8); op<<=(pos - 1); if(flag == 1) data = data | op; if(flag == 0) data = data & ~op; return data; } int main() { unsigned char num = 2; int flag = 1; int pos = 8; num = _operator_bit(num,pos,flag); printf("%d\n",num); system("pause"); return 0; }
一天感覺時間不夠用!