在单片机C语言中如何对变量的某一位进行操作或赋值。 请问:单片机c语言中如何实现将变量A中某1位赋值给B中某1位...

作者&投稿:禹韩 (若有异议请与网页底部的电邮联系)

在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
",(double)x);
fp_s->sign = 0;
fp_s->exp = 0x1;
fp_s->fraction = 0x0;
printf ("float 最小数:      %le
",(double)x);
fp_s->sign = 0;
fp_s->exp = 0;
fp_s->fraction = 0x1;
    printf ("float 最小弱规范数:%le

",(double)x);
return 0;
}

2、使用位运算符

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

C语言提供的位运算符列表:
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0


头文件有定义的就可以直接赋值。没定义的就要定义一个变量,再用变量等于位地址。再给变量赋值。

C语言中static变量的赋值问题~

static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化工作如下:
printf(“%d”,a);
a++;
}
int main()
{
staticLocalVar(); // 第一次调用, 输出a=0
staticLocalVar(); // 第二次调用, 记忆了第一次退出时的值, 输出a=1
return 0;
}

扩展资料
1、static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。
2、static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束。
3、但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。

假如将A第三位赋给B第二位

对于C51架构单片机,可使用位寻址:
bdata A, B;
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_bit(A, 3))set_bit(B, 2);
else clr_bit(B, 2);

这是速度最快的方法。移位操作在编译的时候已经被优化了。

单片机C语言中 int a;
答:回答:int a;是用来说明a是整数,取值范围是-32768~32767。 a--即a的内含值减一,即a=a-1。 可以和0作比较。

单片机C语言中 int a;
答:int a;是用来说明a是整数,取值范围是-32768~32767。a--即a的内含值减一,即a=a-1。可以和0作比较。

在51单片机c语言中在不同存储器中的设定变量关键字有哪些?
答:有以下几种:data 直接寻址片内数据存储区,访问速度快(0X00-0X7F,128字节)bdata (bit)可位寻址片内数据存储区,允许位与字节混合访问(0X20-0X2F,16字节)idata (indirect)间接寻址片内数据存储区,访问片内全部RAM空间(8052,256字节)pdata (page)分页寻址外部数据存储区(256字节)由MOVX @...

关于单片机中 C语言给P1口赋值问题
答:单片机中对每个P口的控制都是用二进制控制的 即使你对它赋了八进制或十进制或十六进制的数 它也会先转换成二进制然后再进行计算的 所以 P1是一个8位寄存器 P1=0x55 0x是16进制的意思 这样化成二进制就是01010101 P1=01010101 好的 你对它进行了八进制的赋值 01010101(你可以试一试 对P1进行0~...

单片机c语言中_cror_ 这个函数是怎么用的??
答:将char型变量循环向左(右)移动指定位数后返回,例如如果二进制数为01010101 那么_crol_(1)左移1位后将高位补低位。结果10101010。

51单片机访问片内数据存储器某单元的内容用c语言怎么写???
答:方法1:char data *p; //定义一个指向片内RAM地址的指针 p = 0x30; //片内RAM地址为0x30 p = 0x12; //向0x30内写入立即数0x12 方法2:include <absacc.h> char x;x = DBYTE[0x30]; //将片内RANM地址0x30的内容赋给变量x DBYTE[0x30] = 0x12; //向0x30...

单片机让一个灯亮sbit led=P1^0可以亮,为什么直接给P1^0=0赋值编译就...
答:bit和sbit都是C51扩展的变量类型。\x0d\x0a\x0d\x0a典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。\x0d\x0a\x0d\x0a在C语言里,如果直接写P1.0,C编译器并\x0d\x0a不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字...

c语言中定义变量,为什么不赋初值啊?
答:在 C 语言中,定义变量时是否给变量赋初值取决于程序员的需求和设计决策。C 语言是一种低级语言,它允许灵活地操作内存,包括不显式地初始化变量。这样的设计允许程序员更好地控制程序的行为和性能。有几个原因可能导致在定义变量时不赋初值:1. **性能考虑:** 在一些情况下,显式初始化变量可能...

单片机C语言中a=~(1<
答:a=~(1<

单片机中用C语言怎样确定一个模拟量数据在变化呢。谢谢
答:这个简单啊,你可以比如设定一个变量X,然后定时(比如5ms)检测一次X,如果两次值相同,就表示没有变化,否则就是变化了,简单不???如果你要精度高的话,可以采用平均值法等等去抑制干扰就可以了。