第 15 章 位操作(dualview)
/*-----------------------------------
dualview.c -- 位字段和按位运算符
-----------------------------------*/ #include <stdio.h>
#include <limits.h> //边框线样式
#define SOLID 0
#define DOTTED 1
#define DASHED 2 //三原色
#define BLUE 4
#define GREEN 2
#define RED 1 //混合颜色
#define BLACK (RED & GREEN & BLUE)
#define YELLOW (RED | GREEN)
#define MAGENTA (RED | BLUE)
#define CYAN (GREEN | BLUE)
#define WHITE (RED | BLUE | GREEN) //按位方法中用到的符号常量
#define OPAQUE 0x1
#define FILL_BLUE 0x8
#define FILL_GREEN 0x4
#define FILL_RED 0x2
#define FILL_MASK 0xE //掩码
#define BORDER 0x100
#define BORDER_BLUE 0x800
#define BORDER_GREEN 0x400
#define BORDER_RED 0x200
#define BORDER_MASK 0xE00
#define B_SOLID 0
#define B_DOTTED 0x1000
#define B_DASHED 0x2000
#define STYLE_MASK 0x3000 struct box_props
{
unsigned int opaque : ;
unsigned int fill_color : ;
unsigned int : ;
unsigned int show_border : ;
unsigned int border_color : ;
unsigned int border_style : ;
unsigned int : ;
}; //把数据看作结构或 unsigned short 类型的变量
union Views
{
struct box_props st_view;
unsigned short us_view;
}; const char *color[] =
{
"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"
}; void show_settings(const struct box_props *pb);
void show_setting1(unsigned short);
char* itobs(int n, char *ps);
void show_bstr(const char *str); int main()
{
printf("size of struct box_props is %d bit\n", CHAR_BIT * sizeof(struct box_props));
printf("size of unsigned short is %d bit\n", CHAR_BIT * sizeof(unsigned short)); //创建 Vies 联合,并初始化 initialize struct box view
union Views box = {{true, YELLOW, true, GREEN, DASHED}};
char bin_str[ * sizeof(unsigned int) + ]; printf("\nOriginal box settings:\n");
show_settings(&box.st_view);
printf("\nBox settings using unsigned int view:\n");
show_setting1(box.us_view);
//printf("bits are %s\n", itobs(box.us_view, bin_str));
printf("bits are:\n");
show_bstr(itobs(box.us_view, bin_str)); box.us_view &= ~FILL_MASK; //把表示填充色的位清零
box.us_view |= CYAN; //重置填充色
box.us_view ^= OPAQUE; //切换透明位
box.us_view &= ~BORDER_MASK; //边框颜色位清零
box.us_view |= BORDER_RED;
box.us_view &= ~STYLE_MASK; //样式位清零
box.us_view |= B_DOTTED; //边框样式设置为点
printf("\nModified box settings:\n");
show_settings(&box.st_view);
printf("\nBox settings using unsigned int view:\n");
show_setting1(box.us_view);
//printf("bits are %s\n", itobs(box.us_view, bin_str));
printf("bits are:\n");
show_bstr(itobs(box.us_view, bin_str)); return ;
} void show_settings(const struct box_props *pb)
{
printf("Box is %s.\n", pb->opaque ? "opaque" : "transparent");
printf("The fill color is %s.\n", color[pb->fill_color]);
printf("Border %s.\n", pb->show_border ? "shown" : "not shown");
printf("The border color is %s.\n", color[pb->border_color]); printf("The border style is ");
switch (pb->border_style)
{
case SOLID:
printf("solid.\n");
break; case DOTTED:
printf("dotted.\n");
break; case DASHED:
printf("dashed.\n");
break; default:
printf("unknown type.\n");
break;
}
} void show_setting1(unsigned short us)
{
printf("Box is %s.\n", (us & OPAQUE) ? "opaque" : "transparent");
printf("The fill color is %s.\n", color[(us >> ) & 0x07]);
printf("Border %s.\n", (us & BORDER) == BORDER ? "shown" : "not shown");
printf("The border color is %s.\n", color[us >> & 0x07]); printf("The border style is ");
switch (us & STYLE_MASK)
{
case B_SOLID:
printf("solid.\n");
break; case B_DOTTED:
printf("dotted.\n");
break; case B_DASHED:
printf("dashed.\n");
break; default:
printf("unknown style");
break;
}
} char* itobs(int n, char *ps)
{
const static int size = CHAR_BIT * sizeof(int); for (int i(size - ); i >= ; --i, n >>= )
ps[i] = ( & n) + ''; ps[size] = '\0'; return ps;
} //以 4 位为一组,显示二进制字符串
void show_bstr(const char *str)
{
int i = ; while (str[i]) //str[i] 不是空字符
{
putchar(str[i]); if (++i % == && str[i])
putchar(' ');
} putchar('\n');
}
dualview.c

第 15 章 位操作(dualview)的更多相关文章
- 第 15 章 位操作(invert4)
/*------------------------------------ invert4.c -- 使用位操作显示二进制 ------------------------------------* ...
- 第 15 章 位操作(binbit)
/*------------------------------------ binbit.c -- 使用位操作显示二进制 ------------------------------------*/ ...
- 第 15 章 位操作(fields)
/*----------------------------------- fields.c -- 定义并使用字段 -----------------------------------*/ #inc ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 【STM32H7教程】第15章 STM32H7的GPIO基础知识(重要)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第15章 STM32H7的GPIO基础知识(重要) ...
- 第15章 LinkedList类(暂无)
第15章 LinkedList类 LinkedList类是
- ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换
15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...
- 第15章 设备无关位图_15.3 DIB和DDB的结合
第15章 设备相关位图_15.3 DIB和DDB的结合 15.3.1 从DIB创建DDB (1)hBitmap =CreateDIBitmap(…)——注意这名称会误导,实际上创建的是DDB 参数 说 ...
- unix network programming(3rd)Vol.1 [第13~15章]《读书笔记系列》
第13章 守护进程和inetd 超级服务器 syslog() daemon_init() setuid() setgid() 第14章 高级IO 标准I/O函数库,支持3种缓冲 缓冲(读写存储设备(硬 ...
随机推荐
- 从零开始学 Web 之 CSS3(三)渐变,background属性
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 从零开始学 Web 之 移动Web(六)响应式布局
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- Nexus安装、使用说明 (转)
1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下 载构件无疑加大了仓库的负载 ...
- linux下xdebug的安装和配置方法
xdebug简介 Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. xdebug安装 首先让php错误显示,只需要修改php.in ...
- vue 动态组件、父子组件传参
1.vue中的自定义属性并获得属性的值 自定义属性::data-id语法为 :data-属性 获取属性的值:ev.target.dataset.id 2.vue父子组件传值 3.动态组件使用
- log | logstash
log | logstash log logstash enter description here 1. 安装 1. 安装java java -version 检查java版本 没有安装则到or ...
- Hadoop专有名词
Hadoop专有名词 一. HDFS 二. MapReduce 1.MRAppMaster:MapReduce Application Master 负责整个过程调度和协调的 2.MapTask:在M ...
- Maven远程仓库的各种配置
1.远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库,默认的中央仓库访问的速度比较慢,访问的人或许很多,有时候也无法满足我们项目的需求,可能项目需要的某些构件中央仓库中是没有的,而在其他 ...
- Flask 中的 特殊装饰器before_request/after_request
before_request :在请求收到之前绑定一个函数做一些事情. after_request: 每一个请求之后绑定一个函数,如果请求没有异常. teardown_request: 每一个请求之后 ...
- php面向对象的接口和APP接口区别
以下是php面向对象的接口: