c语言现代方法 chapter20自学笔记

2023-05-16

如果编写程序需要用到数据在内存中如何存储,那么除非必要,否则不用,如果用,那么集中在程序中的某个模块,不要分散在各处。

20.1 移位运算符

        c语言提供了6个位运算符。这些运算符可以对整数数据进行位运算。这里先讨论2个移位运算符。然后讨论其余4个位运算符。

20.1.1

<<(左移位)和>>(右移位),可以操作任何的整数类型(包括char类型)。

可移植行技巧 为了可移植行,最好仅对无符号数进行移位运算。

 

/*~可以使得我们的底层程序移植行更好*/

#include <stdio.h>
int main(void)
{
unsigned int a1 = ~0; // every bit is 1
unsigned int a2 = 0x1f; //five ones
printf("%lu\n",sizeof(a1));
printf("%u\n",a1);
printf("%u",a2);
	return 0;
}

 注意:

20.1.3用位运算符访问位

(1)位的设置:假设我们要设置第4位(注意:假设共有16位,最高位是15位,最低位是0位),那么我们可以用下面的方法设置:

i = 0x0000;

i |= 0x0010;

更通过的做法是:把要设置的位存储在变量j中,然后通过下面的代码实现:

(2)位的清楚

(3)位的测试

练习题

2.

//chapter20 exe2
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned int i = 18,j = 5;
unsigned int ret = 
	(i & (1 << j)) ? (i &= ~(1 << j)):(i |= (1 << j));
printf("%u",ret);

	return 0;
}

3. 根据异或运算规律,可以知道,最后返回开始时候的y值。

//chapter20 exe3
#include <stdio.h>
#include <stdlib.h>

#define M(x,y) ((x)^=(y),(y)^=x,(x)^=(y))

int main(void)
{
unsigned int x = 8,y = 155;
printf("%u",M(x,y));
	return 0;
}

结果也证实了自己的猜想。

本章需要用到预处理器指令

练习题

4.

#include <stdio.h>
#include <math.h>


#if 0
/*  下面这个宏就是本题的答案  */
#endif

#define MK_COLOR(x,y,z)   \
	(0l | x) | ((0l | y) << 8) | ((0l | z) << 16)

int main()
{
	printf("%lu",sizeof(unsigned long));
	unsigned long a = MK_COLOR(1,2,3);
	printf("\n%lu",a);

	unsigned long ret = pow(2,16) * 3 + pow(2,9) + 1;
	printf("\n%lu",ret);

	return 0;
}

运行结果:197121

5.

#include <stdio.h>
#include <math.h>

#define GET_RED(x) \
	(x & (unsigned long)(pow(2,8) - 1))
#define GET_GREEN(x) \
	((x >> 8) & ((unsigned long) (pow(2,8) - 1 )))
#define GET_BLUE(x) \
	((x >> 8 >> 8) & ((unsigned long) (pow(2,8) - 1 )))

int main()
{

	unsigned long x = GET_RED(197121);
	printf("%lu",x);
	unsigned long y = GET_GREEN(197121);
	printf("\n%lu",y);
	unsigned long z = GET_BLUE(197121);
	printf("\n%lu",z);
	return 0;
}
1
2
3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言现代方法 chapter20自学笔记 的相关文章

  • Ubuntu根目录下各文件夹的作用

    Ubuntu上常识和常用命令 xff1a 1 Ubuntu文件结构 在ubuntu上硬盘的目录和Windows上不同 xff0c Windows可以根据自己的需求分不同的盘符 xff0c 但ubuntu上只有一个盘 xff0c 从根目录开始
  • linux中的export命令介绍

    export Linux中export命令介绍 xff0c 三种方法设置环境变量 CSDN博客
  • 一位 JavaScript 铁杆粉眼中的 Rust

    以下为译文 xff1a 我使用 Rust 编写了一些小工具 xff0c 而且觉得很有乐趣 我的日常工作需要大量使用 JavaScript xff0c 而 Rust 给我一种非常熟悉的感觉 xff0c 因此我决定尝试一下Rust 但与此同时
  • 树莓派3B+搭配Buster版本系统进行红外遥控开发

    一 配件清单 树莓派 xff1a 3B 43 系统版本 xff1a Buster红外接收器 xff1a VS1838B 红外遥控器 xff1a 未知型号 xff08 标有ar mp3字样 xff09 杜邦线若干 二 线路组合准备 根据网上查

随机推荐

  • Rust生态技术栈

    文章目录 Rust开发生态 开发整理 20230106更新 1 日志记录1 1 simple logger1 2 env logger 2 输入 输出3 String类型的match4 print 输出无效问题5 线程6 Excel读取7
  • Rust GUI方案调研

    GUI库方案 xff1a QT xff1a qt功能强大 xff0c 稳定 xff0c 如果功能比较复杂 xff0c 可以考虑qt绑定 orbtk xff1a rust语言编写的操作系统redox项目的GUI方案 xff0c 完全使用rus
  • windows远程Ubuntu(xrdp+vnc)步骤及问题解决方案(ip设置)

    首先将计算机连入相应的路由器 xff0c 登陆账号即可上网 xff0c 下面部分引用了blog xff1a http zhouxiaowei1120 github io Blogs 20160407 html 其中第 xff08 5 xff
  • Ubuntu/debian 中更改桌面的路径/位置

    虚拟机debian系统中安装好vmware tool 后 xff0c 系统的桌面变为了主目录 修改如下 xff1a vi config user dir dirs 把其中的 XDG DESKTOP DIR 61 HOME 改成如下 XDG
  • 八数码问题的可解性

    对于给定八数码棋局的初始状态 xff0c 我们的目标是通过交换空格与其相邻棋子使棋盘达到目标状态 其中 xff0c 游戏规则是只能交换空格与其上下左右四个方向的相邻棋子 假设棋局目标状态为如下形式 xff1a xff08 A B C D E
  • Powershell远程错误整理

    xfeff xfeff 错误现象 权限不够 xff1a 执行Set WSManQuickConfig Enable PSRemoting会报错 xff0c 用Get Item WSMan 检查时会发现其子项无法访问 xff0c 用reged
  • vs2013编译错误error: MSB8020,一招解决这个错误

    错误提示 xff1a error MSB8020 The build tools for v140 Platform Toolset 61 39 v140 39 cannot be found To build using the v140
  • CSP考试 2016年04月第3题 路径解析 C++实现

    表示本目录 xff0c 例如 d1 f1 指定的就是 d1 f1 如果有多个连续的 出现 xff0c 其效果等同于一个 绝对路径 xff1a 以 符号开头 xff0c 表示从根目录开始构建的路径 相对路径 xff1a 不以 符号开头 xff
  • bash环境中的通配符和特殊符号的简单介绍

    Bash环境中可以用通配符 wildcard 来更好的对数据进行处理 下面介绍一些常用的通配符 符号 意义 代表0个到无穷多个任意字符 代表一定有一个任意字符 代表一定有一个在中括号内得字符 非任意字符 例如 abcd 代表一定有一个字符
  • spring boot自定义注解拦截接口

    自定义注解 xff0c 拦截接口请求 maven依赖管理 span class token generics function span class token punctuation lt span dependency span cla
  • nacos与spring cloud

    前言 从微服务兴起后 xff0c 服务治理问题已经成为其最大问题 起初有eureka xff0c zookeeper consul同台竞争 xff0c 本人也使用过eureka 43 config server作为注册中心和配置中心 xff
  • nacos与sentinel

    sentinel 高可用流控 sentinel 是阿里开源的一款系统流控系统 xff0c 可以在线配置本系统请求访问请求控制 软件下载 源码 运行版 运行 nohup java jar sentinel dashboard 1 7 2 ja
  • jenkins 结合ssh 实现多服务器部署jar包

    jenkins使用手册 简介 官网介绍 xff1a Jenkins是开源的CI CD xff08 持续集成 持续交付 xff09 软件领导者 有如下几个优点 xff1a 简单安装配置简单丰富的插件 超过1000个插件扩展性分布式 一 软件下
  • feign调用初始化问题

    最近使用spring cloud微服务遇到一个问题 xff0c 微服务之间使feign第一次调用时会非常的耗时 xff0c 一个请求如果调用链长的情况下 xff0c 接口返回可能会达到10s以上 xff0c 这是一个正常系统都不能容忍的 基
  • VScode 无法下载Go工具解决方案

    使用七牛云代理下载所需要的工具依赖 xff0c 具体配置请查看 说明 https goproxy cn
  • Sonar代码质量管理服务搭建并导入java项目

    1 软件下载 7 4 2 软件配置 打开解压后文件conf sonar properties mysql版本必须大于5 6小于8 0 MySQL gt 61 5 6 amp amp lt 8 0 sonar jdbc url 61 mysq
  • java join方法实现线程的串行

    java实现多线程之间串行执行 xff0c 网上也有很多的教程 在这里我主要说的是 xff1a java Thread类的join函数 xff0c 先贴代码吧 xff1a package cn com fhz thread Created
  • Windows上Rust所依赖的msvc到底怎么装?

    在Windows上面安装Rust的开发环境 xff0c 看起来颇具挑战性 我们会被告知需要安装一个名叫Microsoft Visual Studio C 43 43 build tools的编译工具 xff0c 并被给到一个官方链接 然而
  • Word 转 Markdown

    1 Pandoc 工具将 Word 文档转为 Markdown 可以借助 Pandoc 工具将 Word 文档转为 Markdown xff0c 例如 xff0c 此处将 README docx 转成 README md xff0c 命令如
  • c语言现代方法 chapter20自学笔记

    如果编写程序需要用到数据在内存中如何存储 xff0c 那么除非必要 xff0c 否则不用 xff0c 如果用 xff0c 那么集中在程序中的某个模块 xff0c 不要分散在各处 20 1 移位运算符 c语言提供了6个位运算符 这些运算符可以