weatt123456789 发表于 2017-7-16 17:54:58

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

laujc 发表于 2017-7-16 17:57:26

还可以这样用?

wye11083 发表于 2017-7-16 17:58:32

加括号。。否则得不到结果了

takashiki 发表于 2017-7-16 18:06:17

联合体+位域   或   绝对定位

但是你这个a16 << 16是个什么鬼,你确定不会溢出

czzhouyun 发表于 2017-7-16 18:11:47

8位一个8位一个然后一拼接,ACC.0=a1;ACC.1=a2........,拼一起再移动一位,你这移动的是不是有问题,超出int的范围了

weatt123456789 发表于 2017-7-16 18:34:43

takashiki 发表于 2017-7-16 18:06
联合体+位域   或   绝对定位

但是你这个a16

表达这个意思,就是想把16个变量放在一起,然后用一个变量传递出去。

takashiki 发表于 2017-7-17 06:07:35

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。

cu_ice 发表于 2017-7-17 06:25:09

下面这样的呢?不同的编译器要注意大小端即可

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

zhuozz 发表于 2017-7-17 09:07:07

用共用体吧

strongking 发表于 2017-7-17 17:29:35

a1 = A & 0x0001;
a2 = A & 0x0002;
a3 = A & 0x0004;
a4 = A & 0x0008;
a5 = A & 0x0010;
a6 = A & 0x0020;
.
.
.
.
a16 = A & 0x8000;

weatt123456789 发表于 2017-7-22 21:54:06

strongking 发表于 2017-7-17 17:29
a1 = A & 0x0001;
a2 = A & 0x0002;
a3 = A & 0x0004;


对哦对哦,我记得ARM7好像就是这么操作的,谢谢

supertankhzt 发表于 2018-6-28 14:50:42

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]
查看完整版本: 51里 bit变量如何移位相加