关于C编程中的按位运算,下面的内容是什么意思? [英] What does the following mean with respect to, bitwise operations in C programming?

查看:13
本文介绍了关于C编程中的按位运算,下面的内容是什么意思?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一本关于C编程状态的书

enum corvid { magpie , raven , jay , chough , corvid_num , };
# define FLOCK_MAGPIE 1 U
# define FLOCK_RAVEN 2 U
# define FLOCK_JAY 4 U
# define FLOCK_CHOUGH 8 U
# define FLOCK_EMPTY 0 U
# define FLOCK_FULL 15 U
int main ( void ) {
unsigned flock = FLOCK_EMPTY ;
if ( something ) flock |= FLOCK_JAY ;
...
if ( flock & FLOCK_CHOUGH )
do_something_chough_specific ( flock ) ;

这里,每种乌鸦的常量都是2的幂,所以它们正好是1 位设置在它们的二进制表示中。然后,群中的成员资格可以通过 操作符:|=将corvid添加到flock,并且&;与一个常量一起测试 存在特定的Corvid

问题1.代码在做什么?声明enum corvid的目的是什么?

问题2.这里每种乌鸦的常量是2的幂,所以它们正好是1 位以其二进制表示形式设置。&均值?

推荐答案

在同一文本中越往下越明显。您的示例中的定义是用于位掩码的硬编码&(绝对值)常量。something & 1U表示数据块中的第一位,& 2U表示第二位,& 4U表示第三位,依此类推。

由于某种原因,本书使用十进制记法编写它们,但习惯上使用十六进制记法编写位掩码,因为这就是它们的真实情况,而且这是最容易理解的形式。例如,something & 0xFU屏蔽最低的4位。

在同一章后面,本书根据枚举将硬编码的常量替换为计算的常量。#define FLOCK_MAGPIE (1U << magpie )等等。这样做的好处是可以修改枚举,然后位掩码将相应地更新。使用这样的移位定义可能是定义位掩码的最常见形式,1U << n提供位号n。请注意,任何二进制文件中的第一位称为位0,因此1U << 0提供第一位。

还请注意,所有这些表达式都是整型常量表达式,这意味着它们在编译时计算,并被可执行文件中的常量替换,因此您的程序不需要在运行时计算它们。

这篇关于关于C编程中的按位运算,下面的内容是什么意思?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆