在单片机C语言中如何对变量的某一位进行操作或赋值。

如题所述

在C语言中,一般有两种方法来操作位,一种是使用C语言提供的位运算操作符,一种是使用位域。

1、使用位域

在C语言中定义位域的一般格式如下:

struct ä½åŸŸç»“构名 
  { ä½åŸŸåˆ—表 };

struct:在C语言中定义位域所使用的关键字是struct。

位域结构名:是一个C语言中的标识符,有字母、数字、下划线组成,而且第一个字符必须是字母或者下划线。

位域列表:组其中位域列表的形式为: 类型说明符 位域名:位域长度 

下面的示例代码,通过位域来计算IEEE754浮点数编码中单精度数的最大值 、最小值和最小弱规范数。

#include <stdio.h>
typedef struct FP_SINGLE
{
  unsigned __int32 fraction : 23;
  unsigned __int32 exp      : 8;
  unsigned __int32 sign     : 1;
} fp_single;
int main()
{
float x;
fp_single * fp_s = (fp_single *)&x;
fp_s->sign = 0;
fp_s->exp = 0xfe;
fp_s->fraction = 0x7fffff;
printf ("float æœ€å¤§æ•°ï¼š      %le\n",(double)x);
fp_s->sign = 0;
fp_s->exp = 0x1;
fp_s->fraction = 0x0;
printf ("float æœ€å°æ•°ï¼š      %le\n",(double)x);
fp_s->sign = 0;
fp_s->exp = 0;
fp_s->fraction = 0x1;
    printf ("float æœ€å°å¼±è§„范数:%le\n\n",(double)x);
return 0;
}

2、使用位运算符

 C语言中的位运算符有一个基本的常识,即只能操作整数,不能操作浮点数,因为浮点数是使用IEEE754编码的,使用位操作数没有任何意义。

C语言提供的位运算符列表:
按位与 å¦‚果两个相应的二进制位都为1,则该位的结果值为1,否则为0
按位或 ä¸¤ä¸ªç›¸åº”的二进制位中只要有一个为1,该位的结果值为1
^ æŒ‰ä½å¼‚或 è‹¥å‚加运算的两个二进制位值相同则为0,否则为1
~ å–反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< å·¦ç§» ç”¨æ¥å°†ä¸€ä¸ªæ•°çš„各二进制位全部左移N位,右补0
>> å³ç§» å°†ä¸€ä¸ªæ•°çš„各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-15
头文件有定义的就可以直接赋值。没定义的就要定义一个变量,再用变量等于位地址。再给变量赋值。本回答被网友采纳

在单片机C语言中如何对变量的某一位进行操作或赋值。
在C语言中,一般有两种方法来操作位,一种是使用C语言提供的位运算操作符,一种是使用位域。1、使用位域 在C语言中定义位域的一般格式如下:struct 位域结构名 { 位域列表 };struct:在C语言中定义位域所使用的关键字是struct。位域结构名:是一个C语言中的标识符,有字母、数字、下划线组成,而...

ST单片机C语言有什么指令定义端口的某一位做变量
先用SBIT 设置然后直接让那个变量=1或=0就可以,例如下面的做法 sbit s1=P2^3;然后在程序里直接操作s1=1 或s1=0

单片机怎么用c语言设置I\/O口输入或输出
而51单片机的所有IO引脚,在启动后默认都是1。因此,如之前没有对此引脚进行过置0操作的话,可以直接读该引脚。但为了保险起见,也为了使程序通用、可移植,最好在读取之前对此引脚置1。

请问:单片机c语言中如何实现将变量A中某1位赋值给B中某1位的操作?
sbit a3 = A^3; \/\/位变量指向A第三位 sbit b2 = B^2;b2 = a3;对于其他任何类型单片机,可使用位操作宏(同样适用于C51):define get_bit(var, n) (var & (1<<n))define set_bit(var, n) (var |= (1<<n))define clr_bit(var, n) (var &= ~(1<<n))使用方法 if(get_bi...

单片机机 中怎样和哪几种字节位操作的方式,最好给点C语言代码并解释
1、ANSIC中,一般采用“读-修改-写”的方法实现单个位的位操作,通过与0“与”操作,将某一位清0。如使i变量的b0位为0,实现方法为i=i&0xfe。通过与1“或”操作,将某一位置1。如使i变量的b0位为1,实现方法为i=i|0x01。通过与1“异或”操作,将某一位取反。如使i变量的b0位取反...

单片机中 c语言编程 能不能给P0的某一位直接赋值 如P0^0=5
可以的,必须先定义,再用 sbit led=P1^1;led = 0;单个io是只可以负值1或0

C语言 如何将单片机6个管脚位的值赋给一个字符型变量
可以用这个字符型变量的每一个bit代表一个IO状态,比如:Var=P0_0 | (P0_1<<1) | (P04<<2) | (P0_5<<3) | (P0_6 <<4) | (P0_6<<5);使用时要注意:如果每次要更新不同IO状态,要先清除当前值,然后再赋新值,比如:Var &=~ 0x01; \/\/ 先将P0_1所在的bit位清0;Var |...

单片机C语言,怎么存储和调用一段数据
软件上要添加absacc.h头文件,并以如下方式声明数组或变量 xvar = XBYTE[0x1000]然后对xvar赋值或取值即可 如果用汇编 要用 MOVX A,@DPTR 和\/或 MOVX @DPTR,A 指令分别进行读写 硬件上要用到芯片6264和74LS373 C51芯片的PSEN ALE RD WR都要按照兼容方式连接 单片机可扩展性极佳,提供了丰富的微...

C语言写单片机程序 如何让操纵杆在某一个键一直按着的时候才能有用
1、声明一个按键状态变量key_status,并初始化为0 2、当按键按下并抬起时(此处应该做软件滤波),认为按键被触发,此时:如果key_status==0, 就让key_status赋值为1 如果key_status==1, 就让key_status赋值为0 3、操纵杆作用七段数码管动作程序只有在key_status==1的时候执行,其他不动作 while(...

单片机8051中怎么用C语言的指针变量指量片内RAM某一个单元
如果这个50H是固定的,就定义SFR:sfr xxx=0x50,以后对xxx的作操就是对50H单元的操作。如果是不定的,就不行了,因为C语言编译器会自动分配各内存单元。此时变通的方法就是嵌入汇编语言。就你补充的,据我所知是不行的,唯一的方法就是嵌入汇编语言。

相似回答