(嵌入式)位(bit)操作

嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置abit 3,第二个清除bit 3。在以上两个操作中,要保持其它位不变。

 对这个问题有三种基本的反应:

1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。

2) bit fieldsBit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。

3)  #defines  bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。


最佳的解决方案如下:

#define BIT3 (0x1 << 3) 

(采用宏将数字定义为有意义的BIT3,明确,不易出错,改起来方便)

static int a;

void set_bit3(void) 

{

a |= BIT3;

}

void clear_bit3(void) 

{

a &= ~BIT3;

}

 

一些人喜欢为设置和清除值而定义一个掩码(待操作位全1,其余位全0的数,对于某个意义靠多位同时表示的最好带上掩码,隔离其他位的影响)同时定义一些说明常数,这也是可以接受的。

我希望看到几个要点:说明常数、|=&=~操作,先取反再&是对某位清0的最好操作

 

考点:

在嵌入式系统中,时刻要关注移植性,具体的程序中不要出现具体的数字,这些数字都应该define成某个有意义的符号,可读性可移植性都很强,比如

#define BIT(x) (0x1 << (x))

X作为参数可以很方便的对任意位进行操作,意义明确,更改替换方便.


1.编写一个C语言函数,该函数给出一个字节中被置1的位的个数。

方法1:

#include <stdio.h>

#define Bit(i) (0x01<<i)

int Test(char log)

{

    int num=0;

    int i;

    char val;

    for (i=0;i<8;i++)

    {

        val=log & Bit(i);

        if(val)

        {num++;}

    }

    return num;

}

void main()

{

    int num1;

    num1=Test(15);

    printf ("%d\n",num1);

}


方法2:

#include <stdio.h>

#define Bit(i) (0x01<<i)

int Test(char log)

{

    int num=0;

    int i;

    char val;

    for (i=0;i<8;i++)

    {

        val=log >>i;

        val&=0x01;//val=val&0x01;

        if(val)

        {num++;}

    }

    return num;

}

void main()

{

    int num1;

    num1=Test(15);

    printf ("%d\n",num1);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值