C语言:请编码实现以下功能的函数 功能:实现对一个8bit数据(unsigned char 类型)的指定位(例如第n位)的置0或者置1操作,并保持其他位不变。


题目:请编码实现以下功能的函数
功能:实现对一个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;
}

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值