没有合适的资源?快使用搜索试试~ 我知道了~
首页C++学习附录:计数系统与进制转换
C++学习附录:计数系统与进制转换
需积分: 0 2 下载量 129 浏览量
更新于2024-06-17
收藏 1.24MB PDF 举报
本附录主要介绍了C++语言中涉及的计数系统及其在编程中的应用。章节A详细讲述了不同计数系统的起源和发展,包括罗马数字、印度计数系统(阿拉伯计数系统的基础)以及现代计算机使用的十进制、八进制、十六进制。其中,十进制是日常生活中最常见的计数体系,其特点是基数为10,数字0-9表示10的幂次。 八进制数利用基数8,通过0-7的数字表示,C++使用前缀0来明确它是八进制,如0177。八进制在UNIX系统中常见,便于数值表示。十六进制则基于16的幂,如a-f分别代表10-15,大小写形式均可接受,C++使用0x或0X作为前缀来区分十六进制,如0x2B3等价于十进制的691,常用于硬件文档的表示。 此外,附录还强调了C++语言的灵活性,它支持使用不同的基数来书写整数,这在处理特定领域的数据时显得非常有用。理解这些计数系统及其在C++中的应用,有助于程序员更有效地进行数值操作和代码编写。学习者可以通过查阅标准模板库的方法和函数,以及推荐的读物和在线资源,进一步深化对C++中计数系统的理解和实践。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/88771703/bge.jpg)
694
附录E 其他运算符
图 E.4 按位运算符 OR
表 E.1 对∣运算符的操作方式进行了总结。
表 E.1 b1|b2 的值
位 值
b1 = 0
b1 = 1
b2 = 0
0
1
b2 = 1
1
1
运算符| =组合了按位运算符 OR 与赋值运算符的功能:
a |= b; // set a to a | b
按位运算符 XOR(^)将两个整数值结合起来,生成一个新的整数值。如果原始值中对应的位有一个
(而不是两个)为 1,则新值中相应位为 1;如果对应的位都为 0 或 1,则新值中相应位为 0(参见图 E.5)。
图 E.5 按位运算符 XOR
表 E.2 总结了^运算符的结合方式。
表 E.2 b1^b2 的值
位 值
b1 = 0
b1 = 1
b2 = 0
0
1
b2 = 1
1
0
^ =运算符结合了按位运算符 XOR 和赋值运算符的功能:
a ^= b; // set a to a ^ b
按位运算符 AND(&)将两个整数结合起来,生成一个新的整数值。如果原始值中对应位都为 1,则
新值中相应位为 1,否则为 0(参见图 E.6)。
![](https://csdnimg.cn/release/download_crawler_static/88771703/bgf.jpg)
附录E 其他运算符
695
图 E.6 按位运算符 AND
表 E.3 总结了&运算符是如何运算的。
表 E.3 b1&b2 的值
位 值
b1 = 0
b2 = 1
b2 = 0
0
0
b2 = 1
0
1
& =运算符结合了按位运算符 AND 和赋值运算符的功能:
a &= b; // set a to a & b
E.1.3 按位运算符的替代表示
对于几种按位运算符,C++提供了替代表示,如表 E.4 所示。它们适用于字符集中不包含传统按位运
算符的区域。
表 E.4 按位运算符的替代表示
标 准 表 示
替 代 表 示
&
bitand
& =
and_eq
|
bitor
| =
or_eq
~
compl
^
xor
^ =
xor_eq
这些替代表示让您能够编写下面这样的语句:
b = compl a bitand b; // same as b = ~a & b;
c = a xor b; // same as c = a ^ c;
E.1.4 几种常用的按位运算符技术
控制硬件时,常涉及打开/关闭特定的位或查看它们的状态。按位运算符提供了执行这种操作的途径。
下面简要地介绍一下这些方法。
在下面的示例中,lottabits 表示一个值,bit 表示特定位的值。位从右到左进行编号,从 0 开始,因此,
第 n 位的值为 2
n
。例如,只有第 3 位为 1 的整数的值为 2
3
(8)。一般来说,正如附录 A 介绍的,各个位都对
应于 2 的幂。因此我们使用术语位(bit)表示 2 的幂;这对应于特定位为 1,其他所有位都为 0 的情况。
1. 打开位
下面两项操作打开 lottabits 中对应于 bit 表示的位:
lottabits = lottabits | bit;
lottabits |= bit;
它们都将对应的位设置为 1,而不管这一位以前的值是多少。这是因为对 1 和 1 或者 0 和 1 执行 OR
操作时,都将得到 1。lottabits 中其他所有位都保持不变,这是因为对 0 和 0 做 OR 操作将得到 0,对 1 和
0 做 OR 操作将生成 1。
![](https://csdnimg.cn/release/download_crawler_static/88771703/bg10.jpg)
696
附录E 其他运算符
2. 切换位
下面两项操作切换 lottabits 中对应于 bit 表示的位。也就是说,如果位是关闭的,则将被打开;如果位
是打开的,将被关闭:
lottabits = lottabits ^ bit;
lottabits ^= bit;
对 0 和 1 执行 XOR 操作的结果为 1,因此将关闭已打开的位;对 1 和 1 执行 XOR 操作的结果为 0,
因此将打开已关闭的位。lottabits 中其他所有位都保持不变,这是因为对 0 和 0 执行 XOR 操作的结果为 0,
对 1 和 0 执行 XOR 操作的结果为 1。
3. 关闭位
下面的操作将关闭 lottabits 中对应于 bit 表示的位:
lottabits = lottabits & ~bit;
该语句关闭相应的位,而不管它以前的状态如何。首先,运算符~bit 将原来为 1 的位设置为 0,原来
为 0 的位设置为 1。对 0 和任意值执行 AND 操作都将得到 0,因此关闭相应的位。lottabits 中其他所有位
都保持不变,这是因为对 1 和任意值执行 AND 操作时,该位的值将保持不变。
下面是一种更简洁的方法:
lottabits &= ~bit;
4.测试位的值
如果要确定 lottabits 中对应于 bit 的位是否为 1,则下面的测试不一定管用:
if (lottabits == bit) // no good
这是因为即使 lottabits 中对应的位为 1,而其他位也可能为 1。仅当对应的位为 1,而其他位皆为 0 时,
上述等式才为 true。因此修补的方式是,首先对 lottabits 和 bit 执行 AND 操作,这样生成的值的对应位保
持不变,因为对 1 和任何值执行 AND 操作都将保持该值不变;而其他位都为 0,因为对 0 和任何值执行
AND 操作的结果都为 0。正确的测试如下:
if (lottabits & bit == bit) // testing a bit
实际应用中,程序员常将上述测试简化为:
if (lottabits & bit) // testing a bit
因为 bit 中有一位为 1,而其他位都为 0,因此 lottabits & bit 的结果要么为 0(测试结果为 false),要么
为 bit(非零值,测试结果为 true)。
E.2
成员解除引用运算符
C++允许定义指向类成员的指针,对这种指针进行声明或解除引用时,需要使用一种特殊的表示法。
为说明需要使用的特殊表示法,先来看一个样本类:
class Example
{
private:
int feet;
int inches;
public:
Example();
Example(int ft);
~Example();
void show_in() const;
void show_ft() const;
void use_ptr() const;
};
如果没有具体的对象,则 inches 成员只是一个标签。也就是说,这个类将 inches 定义为一个成员标识
符,但要为它分配内存,必须声明这个类的一个对象:
Example ob; // now ob.inches exists
因此,可以结合使用标识符 inches 和特定的对象,来引用实际的内存单元(对于成员函数,可以省略
对象名,但对象被认为是指针指向的对象)。
C++允许这样定义一个指向标识符 inches 的成员指针:
int Example::*pt = &Example::inches;
这种指针与常规指针有所差别。常规指针指向特定的内存单元,而 pt 指针并不指向特定的内存单元,因为
![](https://csdnimg.cn/release/download_crawler_static/88771703/bg11.jpg)
附录E 其他运算符
697
声明中没有指出具体的对象。指针 pt 指的是 inches 成员在任意 Example 对象中的位置。和标识符 inches 一样,
pt 被设计为与对象标识符一起使用。实际上,表达式*pt 对标识符 inches 的角色做了假设,因此,可以使用对象标
识符来指定要访问的对象,使用 pt 指针来指定该对象的 inches 成员。例如,类方法可以使用下面的代码:
int Example::*pt = &Example::inches;
Example ob1;
Example ob2;
Example *pq = new Example;
cout << ob1.*pt << endl; // display inches member of ob1
cout << ob2.*pt << endl; // display inches member of ob2
cout << po->*pt << endl; // display inches member of *po
其中,*和->*都是成员解除引用运算符(member dereferencing operator)。声明对象(如 obl)后,ob1.*pi
指的将是 ob1 对象的 inches 成员。同样,pq->*pt 指的是 pq 指向的对象的 inches 成员。
改变上述示例中使用的对象,将改变使用的 inches 成员。不过也可以修改 pt 指针本身。由于 feet 的类
型与 inches 相同,因此可以将 pt 重新设置为指向 feet 成员(而不指向 inches 成员),这样 ob1.*pt 将是 ob1
的 feet 成员:
pt = &Example::feet;
// reset pt
cout << ob1.*pt << endl; // display feet member of ob1
实际上,*pt 相当于一个成员名,因此可用于标识(相同类型的)其他成员。
也可以使用成员指针来标识成员函数,其语法稍微复杂点。对于不带任何参数、返回值为 void 的函数,
声明一个指向该函数的指针的代码如下:
void (*pf)(); // pf points to a function
声明指向成员函数的指针时,必须指出该函数所属的类。例如,下面的代码声明了一个指向 Example
类方法的指针:
void (Example::*pf)() const; // pf points to an Example member function
这表明 pf 可用于可使用 Example 方法的地方。注意,Example::*pf 必须放在括号中,可以将特定成
员函数的地址赋给该指针:
pf = &Example::show_inches;
注意,和普通函数指针的赋值情况不同,这里必须使用地址运算符。完成赋值操作后,便可以使用一
个对象来调用该成员函数:
Example ob3(20);
(ob3.*pf)(); // invoke show_inches() using the ob3 object
必须将 ob3.*pf 放在括号中,以明确地指出,该表达式表示的是一个函数名。
由于 show_feet()的原型与 show_inches()相同,因此也可以使用 pf 来访问 show_feet()方法:
pf = &Example::show_feet;
(ob3.*pf)();
// apply show_feet() to the ob3 object
程序清单 E.1 中的类定义包含一个 use_ptr()方法,该方法使用成员指针来访问 Example 类的数据成员
和函数成员。
程序清单 E.1 memb_pt.cpp
// memb_pt.cpp -- dereferencing pointers to class members
#include <iostream>
using namespace std;
class Example
{
private:
int feet;
int inches;
public:
Example();
Example(int ft);
~Example();
void show_in() const;
void show_ft() const;
void use_ptr() const;
};
Example::Example()
{
feet = 0;
inches = 0;
剩余81页未读,继续阅读
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/73035e726e19455586b9380c375b1e7e_qq_66413028.jpg!1)
.凌落の星辰
- 粉丝: 56
- 资源: 2
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 利用迪杰斯特拉算法的全国交通咨询系统设计与实现
- 全国交通咨询系统C++实现源码解析
- DFT与FFT应用:信号频谱分析实验
- MATLAB图论算法实现:最小费用最大流
- MATLAB常用命令完全指南
- 共创智慧灯杆数据运营公司——抢占5G市场
- 中山农情统计分析系统项目实施与管理策略
- XX省中小学智慧校园建设实施方案
- 中山农情统计分析系统项目实施方案
- MATLAB函数详解:从Text到Size的实用指南
- 考虑速度与加速度限制的工业机器人轨迹规划与实时补偿算法
- Matlab进行统计回归分析:从单因素到双因素方差分析
- 智慧灯杆数据运营公司策划书:抢占5G市场,打造智慧城市新载体
- Photoshop基础与色彩知识:信息时代的PS认证考试全攻略
- Photoshop技能测试:核心概念与操作
- Photoshop试题与答案详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)