【读书笔记】C Primer Plus ch.15位运算 示例程序15.3 定义并使用字段

通常,把位字段作为一种更紧凑储存数据的方式。

程序清单 15.3 fields.c

 1 #include <stdio.h>
 2 #include <stdbool.h>
 3 // 线的样式
 4 #define SOLID 0 // 实线
 5 #define DOTTED 1 // 点线
 6 #define DASHED 2 // 虚线
 7 // 三原色
 8 #define BLUE 4
 9 #define GREEN 2
10 #define RED 1
11 // 混合色
12 #define BLACK 0
13 #define YELLOW (RED|GREEN)
14 #define MAGENTA (RED|BLUE)
15 #define CYAN (GREEN|BLUE)
16 #define WHITE (RED|GREEN|BLUE)
17
18 const char * colors[8] = { "black","red","green","yellow",
19 "blue","magenta","cyan","white" };
20
21 struct box_props {
22     bool opaque : 1; // 方框是否透明
23     unsigned int fill_color : 3;
24     unsigned int : 4; // 每个字节间的空隙用未命名字段填充
25     bool show_border : 1; // 边框显示或隐藏
26     unsigned int border_color : 3;
27     unsigned int border_style : 2;
28     unsigned int : 2;
29 };
30
31 void show_settings(const struct box_props * pb)
32 {
33     printf("Box is %s.\n", pb->opaque == true ? "opaque" : "transparent");
34     printf("The fill color is %s.\n", colors[pb->fill_color]);
35     printf("Border %s.\n", pb->show_border == true ? "shown" : "not shown");
36     printf("The border color is %s.\n", colors[pb->border_color]);
37     printf("The border style is ");
38     switch (pb->border_style)
39     {
40     case SOLID:
41         puts("solid.");
42         break;
43     case DOTTED:
44         puts("DOTTED.");
45         break;
46     case DASHED:
47         puts("dashed.");
48         break;
49     default:
50         puts("unknown type.");
51     }
52 }
53
54 int main(void)
55 {
56     struct box_props box = { true,YELLOW,true,GREEN, DASHED };
57
58     puts("Original box settings:");
59     show_settings(&box);
60
61     box.opaque = false;
62     box.fill_color = WHITE;
63     box.border_color = MAGENTA;
64     box.border_style = SOLID;
65     puts("\nModified box settings:");
66     show_settings(&box);
67
68     return 0;
69 }
时间: 2024-12-19 04:56:32

【读书笔记】C Primer Plus ch.15位运算 示例程序15.3 定义并使用字段的相关文章

【读书笔记】C Primer Plus ch.15位运算 示例程序15.1 整数转换成二进制字符串

正文: https://www.zybuluo.com/RayChen/note/595213

汇编语言程序设计读书笔记(2)- 相关工具64位系统篇

汇编语言程序设计一书,在32位系统下应该不会有什么问题,然而在64位系统下,则会有些不一样的地方.有些程序范例还会汇编错误或者执行错误. 博主所用系统为CentOS v6.4 x64.本文主要解决32位的汇编程序如何在64位环境下汇编.连接,而不论述64位汇编语言如何设计. 1. 64位系统下编译32位的C程序 以程序test5.c为例,程序代码很简单,如下: test5.c#include <stdio.h> int main() { char str[4]; str[0]='f'; str

C#位运算示例和enum中的位运算

今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与. 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { ....

【学习笔记】【C语言】位运算

1. & 按位与 1> 功能 只有对应的两个二进位均为1时,结果位才为1,否则为0. 2> 举例: 比如9&5,其实就是1001&101=1,因此9&5=1 3> 规律 二进制中,与1相&就保持原位,与0相&就为0 2. | 按位或 1> 功能 只要对应的二个二进位有一个为1时,结果位就为1,否则为0. 2> 举例: 比如9|5,其实就是1001|101=1101,因此9|5=13 3. ^ 按位异或 1> 功能 当对应的

《Python Network Programming Cookbook》读书笔记1---套接字, IPv4, 简单的Client/Server程序

这一部分主要介绍python中socket模块的相关内容,socket即套接字. socket是使用TCP/IP协议的应用程序通常采用的应用编程接口,它位于运输层和应用层之间,起源于UNIX,由于遵从UNIX“一切皆文件的”思想故socket可看作一种特殊的文件,对其的操作基本可以视为读写I/O.打开.关闭.关于套接字的基本概念@吴秦的Linux Socket编程(不限Linux)写的很详细,大家可以参考. 在下面列出的各个部分中我将先贴出代码,然后对其进行解释. 通过python3获得本机名和

《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算

对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生成透视表.groupby函数能高效处理数据,对数据进行切片.切块.摘要等操作.可以看出这跟SQL关系密切,但是可用的函数有很多.在本章中,可以学到: 根据一个或多个键(可以是函数.数组或DataFrame列名)拆分pandas对象 计算分组摘要统计,如计数.平均值.标准差.,或自定义函数 对DataFrame的列应用各种各样的函数 应用组内转换或其他运算,如规格化.线性回归.排名或选取子集等

发现中文版《C Primer Plus第五版》示例程序的一个错误

错误的程序出现再第17章的499页ListItemCount()和500页的Traverse()两个函数上. 原著包含所有函数定义的list.c如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include "list.h" 4 5 static void CopyToNode(Item item,Node * pnode); 6 7 void InitializeList(List * plist) 8 { 9

《C陷阱与缺陷》读书笔记

<C陷阱与缺陷>读书笔记 1.编译器中的词法分析器负责将程序分解为一个个符号.C语言中,符号之间的空白 (包括Space ,Tab , Enter) 都将被忽略,但一个符号的中间不能有空白,否则可能被解释成为另一个或几个符号. 2.编译器将程序分解成符号的方法是从左到右逐个字符读入,如果该字符可能会组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的

汇编语言程序设计读书笔记(3)- 程序范例

主要描述三方面的内容:第一是汇编语言的程序模版,以及模版涉及到的一些知识点:第二是如何调试汇编语言:第三是如何在汇编语言中调用C库函数. 1. 汇编语言的组成 汇编语言由段(section)组成,一个程序中执行的代码,叫文本段(text),程序还可能有定义变量,有付给初始值的变量放在数据段(data)中,没有赋初值或者付给零初值的放在bss段中.text段一定是要有的,data和bss可以没有. 2. 段的定义 用.section语法定义段.比如: .section .text定义文本段, .s