题目:请编码实现以下功能的函数
功能:实现对一个8bit数据(unsigned char 类型)的指定位(例如第n位)的置0或者置1操作,并保持其他位不变。
函数原型:void bit_set(unsigned char *p_data,unsigned char position,int flag)
分析:1111---15
把第三位置0后为:1011 而1011是由原数据与1011按位与所得,而想得到1011,就可以由0100按位取反得到,而0100,又由1左移两位(pos-1位)得到
同理:1011---11
把第三位置1后为:1111 而1111是由原数据与0100按位或所得,而0100是1左移两位所得即pos-1位得到
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char bit_set(unsigned char *p_data, unsigned char pos, int flag)
{
assert(p_data);
if (flag == 1)
{
*(p_data) |= (1 << (pos - 1));
}
else if (flag==0)
{
*(p_data) &=~(1 << (pos - 1));
}
return *p_data;
}
int main()
{
unsigned char num1= 15;//1111
unsigned char ret1 = bit_set(&num1, 3, 0);//11
printf("%d\n", ret1);
unsigned char num2= 11;
unsigned char ret2 = bit_set(&num2, 3, 1);
printf("%d\n", ret2);
system("pause");
return 0;
}
结果如下: