C语言中的位运算

2019-03-31  本文已影响0人  simonycshi

C语言中的位运算

位域

struct { 
    unsigned int a : 1; //a占1为bit,最大为2^1 - 1 = 1
    unsigned int b : 3; //b占3位bit,最大为2^3 - 1 = 7
    unsigned int c : 1; //c占1位bit,最大为2^1 - 1 = 1
} exmpl;

用例:假设有一种机器人使用1 Byte大小的数据包进行通信,但是需要发送多个状态信息

struct device { 
    unsigned int active : 1; 
    unsigned int ready : 1; 
    unsigned int idle : 1; 
    unsigned int error : 1; 
} code;
内存位置

位域也可以匿名:

struct device { 
    unsigned int active : 1;
    unsigned int ready : 1;
    unsigned int idle : 1;
    unsigned int error : 1;
    unsigned int : 2;
    unsigned int EOR : 1;
} code;
```[图片上传失败...(image-a26aed-1554036927678)]

# 位域的大小
```c
//exmpl占12 Bytes
struct { 
    unsigned int a : 1;
    unsigned int b : 32;
    unsigned int c : 1;
} exmpl;
//exmpl占8 Bytes
struct { 
    unsigned int a : 1;
    unsigned int b : 1;
    unsigned int c : 32;
} exmpl;

按位运算符

各种语言中的位运算符



逻辑运算和位运算

位运算的用途

  1. 追踪错误
char get_char_from_modem(void) {
    char ch;
    ch = read_modem (); // 从Modem中读取一个数据  
    return (ch & 127); 
}
奇偶校验数据



2. 使用按位XOR寻找不同的位数

int x = 120; 
x = 127 ^ x;
不同的位数



3. 使用求反来加密数据

数据加密

其他操作

1. 16进制表示

#include <stdio.h> 
int main(){ 
    int n = 0x01A1; 
    n = n & 0xFF; /* Note: n &= 0xFF; is the same */        
    printf("%x\n",n); return 0; 
}

//输出:a1
16进制表示



2. 使用Bit Mask检查16进制的具体位数

//检查整数y右边的第三位是1还是0
int mask = 0x0004; 
if ((y & mask) == 0)
    printf("Third bit = 0\n"); 
else
    printf("Third bit = 1\n");
Bit Mask检查



3. 使用Bit Mask修改部分位数:

//让左边的4位归零,右边的4位不动
char cmask = 0x0F; 
c &= cmask;
修改部分位数



4. 移位操作:

int n = 0x01A1; 
int n1, n2, n3, n4;
n1 = n << 1; /* Value of n1 = 0x0342 */
n2 = n << 4; /* Value of n2 = 0x1A10 */
n3 = n >> 1; /* Value of n3 = 0x00D0 */
n4 = n >> 4; /* Value of n4 = 0x001A */ 
移位操作
上一篇下一篇

猜你喜欢

热点阅读