C/C++ 中与运算和位移运算使用见解

本人对与运算(&)和位移(<< >>)运算在java学习中遇到的情况比较少,主要介绍C/C++ 中的使用情况。

主要是根据目前学习中遇到的情况进行介绍,也是结合最近学习的内容进行举例介绍来说明问题
实例场景是在H264 编码中分离 NALU 单元进行数据封包,定义的 NALU head (NALU 头结构)
主要是为了说明为与运算和位移运算这个是知识点,如果需要对H264 和 NALU 进一步了解的可以自己百度。


图片内容中是占用一字节(八位)NALU 头结构分析图
定义的 NALU 头结构
typedef struct nalu_header {
/* byte 0 */
uint8_t type : 5; /* bit: 0~4 */
uint8_t nri : 2; /* bit: 5~6 */
uint8_t f : 1; /* bit: 7 */
} __attribute__((packed)) nalu_header_t; /* 1 bytes */

从左往右:高向低位
图中的 0 在地址中代表最高位,7代表最低位

uint8_t *nalu_buf;
nalu_header_t *nalu_hdr;
......
nalu_hdr = (nalu_header_t *)&SENDBUFFER[12]; //头结构的初始化
nalu_hdr->f = (nalu_buf[0] & 0x80) >> 7; /* bit 0 */
nalu_hdr->nri = (nalu_buf[0] & 0x60) >> 5; /* bit 1~2 */
nalu_hdr->type = (nalu_buf[0] & 0x1f); /* bit 5*/


以上是拿程序中的片段代码来具体说明
nalu_hdr->f = (nalu_buf[0] & 0x80) >> 7 ; 表达的意思:
从头结构图中可以得出 nalu_hdr->f 代表 F 占用 1 bit 且是最高位,而 nalu_buf[0] 是占用八位,
我们只取最高位 1 位,其他位可以舍弃 。
nalu_buf[0] & 0x80 可以换成二进制 nalu_buf[0] & 1000 0000 最高位不变其他位置0 ,也就得到所需的最高位,在通过 右移 7位 ,最后只得到最高位 1位 。
同理,按我的理解,如果不进行与运算直接进行位运算也是可以得到真确结果,这仅仅是右移的时候可以,如果左移就不可以。因为右移低位将被舍弃,结果是一样的。
nalu_buf[0] & 0x60 = nalu_buf[0] & 0110 0000
nalu_buf[0] & 0x1f = nalu_buf[0] & 0001 1111


总结:

正常数据的获取和定义是通过基本数据类型 int , char 等,像一些头协议就需要考虑到位,就可能需要进行位运算,就涉及到位运算。所以进行与运算和位移运算,主要是通过地址位运算获取对应的位内容

以上是自己学习过程的见解,也希望大家分享你的想法和见解以及待纠正内容

猜你喜欢

转载自blog.csdn.net/cndm123/article/details/80824688