【C语言】位域 & 位操作

位域(是表示二进制的位)

使用位域是节省内存的一种操作,它能是 int 不用占用4字节的空间

虽然现在的机器都是 8G、16G的,但是在单片机的寸土寸金的内存上,还是需要对内存占用进行自定义的控制

位的大小:8 位 构成 1 字节。1 byte (字节)= 8 bit(位);

字节的大小:1024字节 等于 1 KB。 1 KB = 1024 B(字节);

// 位域的定义是在结构体里
struct ToDay {
    unsigned int mouth:3; // 在成员名后加 冒号:位的大小
    undigned int day:2;
};

位于的使用

#include <stdio.h>

struct ToDay {
    unsigned int mouth:3; // 在成员名后加 冒号:位的大小
    unsigned int day:2;
} toDay;

int main(void){
    toDay.mouth = 8;
    toDay.day = 3;
    printf("size of toDay:%d\n",sizeof(toDay));
    printf("toDay.mouth = %d\n",toDay.mouth);
    printf("toDay.day = %d\n",toDay.day);
    return 0;
}

mark

位操作

位操作时对二进制位 进行 一元和二元操作逻辑操作

在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多

在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。

运算符 含义 优先级 举例 说明
~ 按位取 ~a 如果 a 为 1,则 ~a 为 0
如果 a 为 0,则 ~a 为 1
& 按位取 a&b 只有 a b 同时为 1,结果才为 1
只要 a b 其中一个为 0,结果就为 0;
^ 按位取异或 a^b 如果 a b 不同,则 结果为 1
如果 a b 相同,则 结果为 0
| 按位取 最低 a|b 如果 a b 其中一个为 1,则 结果 为 1
如果 a b 同时为 0,则 结果为 0

按位取反(~)

  ~000000
=> 111111

按位取与(&)

   001010
 &
   010110
=> 000010

按位取异或(^)

   010110
 ^
   011001
=> 001111

按位取或(|)

   010011
 |
   100110
=> 110111
发表评论 / Comment

用心评论~