51里 bit变量如何移位相加
本帖最后由 weatt123456789 于 2017-7-16 18:37 编辑int A; // (16位变量)
bit a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;
我想做的是:
A= a1<<0 + a2<<1 + a3<<2 + a4<<3 + a5<<4+ a6 <<5 ..................a16<<15
我知道如果把a1,a2,a3....a16换成16位倒是没问题,换成BIT我就不知道怎么搞了。
就是想把16个 BIT变量,用一个INT变量传递到函数,以前用 unsigned char现在想改成BIT 还可以这样用? 加括号。。否则得不到结果了 联合体+位域 或 绝对定位
但是你这个a16 << 16是个什么鬼,你确定不会溢出 8位一个8位一个然后一拼接,ACC.0=a1;ACC.1=a2........,拼一起再移动一位,你这移动的是不是有问题,超出int的范围了 takashiki 发表于 2017-7-16 18:06
联合体+位域 或 绝对定位
但是你这个a16
表达这个意思,就是想把16个变量放在一起,然后用一个变量传递出去。 weatt123456789 发表于 2017-7-16 18:34
表达这个意思,就是想把16个变量放在一起,然后用一个变量传递出去。
我假设你用的是Keil C51,别的编译器我也不清楚。int bdata A;
sbit a0 = A ^ 8;
sbit a1 = A ^ 9;
sbit a2 = A ^ 10;
sbit a3 = A ^ 11;
sbit a4 = A ^ 12;
sbit a5 = A ^ 13;
sbit a6 = A ^ 14;
sbit a7 = A ^ 15;
sbit a8 = A ^ 0;
sbit a9 = A ^ 1;
sbit a10 = A ^ 2;
sbit a11 = A ^ 3;
sbit a12 = A ^ 4;
sbit a13 = A ^ 5;
sbit a14 = A ^ 6;
sbit a15 = A ^ 7;
请注意:由于Keil C51采用大端对齐,因此后面定义位变量有高低字节有交叉。这样你写a0 = 1自然就是A的第0位为1了。
特别提醒:数据类型是sbit而不是bit。 下面这样的呢?不同的编译器要注意大小端即可
typedef struct
{
uint8_t v_a0:1;
uint8_t v_a1:1;
uint8_t v_a2:1;
uint8_t v_a3:1;
uint8_t v_a4:1;
uint8_t v_a5:1;
uint8_t v_a6:1;
uint8_t v_a7:1;
uint8_t v_a8:1;
uint8_t v_a9:1;
uint8_t v_a10:1;
uint8_t v_a11:1;
uint8_t v_a12:1;
uint8_t v_a13:1;
uint8_t v_a14:1;
uint8_t v_a15:1;
}VL16_TYPE;
VL16_TYPE A;
#define a0 A.v_a0
#define a1 A.v_a1
#define a2 A.v_a2
#define a3 A.v_a3
...
#define a15 A.v_a15
用共用体吧 a1 = A & 0x0001;
a2 = A & 0x0002;
a3 = A & 0x0004;
a4 = A & 0x0008;
a5 = A & 0x0010;
a6 = A & 0x0020;
.
.
.
.
a16 = A & 0x8000; strongking 发表于 2017-7-17 17:29
a1 = A & 0x0001;
a2 = A & 0x0002;
a3 = A & 0x0004;
对哦对哦,我记得ARM7好像就是这么操作的,谢谢 int A; // (16位变量)
bit a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;
A=((int)a1)<<0 | ((int)a2)<<1 | ((int)a3)<<2 ... ((int)a16)<<15;
页:
[1]