1. 程式人生 > >位運算之指定位操作

位運算之指定位操作

# 題目: 實現對一個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,就是我們想要的結果了; 好了,嘴上的功夫完了,下面就是手底下的功夫了; */ # 演算法流程圖:
op就是我們定義的 1;data就是要操作的那8bit數;flag表示將指定位置為0,還是1; pos表示指定位! @程式碼實現:
#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;
}


一天感覺時間不夠用!