计算概论A B03 C++语言的基本成分 - 运算成分(2)

Similar documents
C/C++语言 - C/C++数据

没有幻灯片标题

PowerPoint 演示文稿

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

CC213

第一章 绪论

新版 明解C++入門編

第二章 C++简单程序设计

C/C++程序设计 - 字符串与格式化输入/输出

c_cpp

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

FY.DOC

PowerPoint 演示文稿

《计算概论》课程 第十九讲 C 程序设计语言应用

C C

PowerPoint 演示文稿

<4D F736F F F696E74202D20B5DA32D5C220B5A5C6ACBBFA433531D3EFD1D4BBF9B4A1>

第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

ch02_Basic

C 1

論鄭玄對《禮記‧月令》的考辨

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Microsoft Word - em78 sub program.doc


C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

第3章.doc

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 1. C++介绍.ppt [兼容模式]

chap07.key

untitled

没有幻灯片标题

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 第1篇(1-6).DOC

e 2 3 2

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

<4D F736F F D204323B3CCD0F2C9E8BCC6BDCCB3CCA3A8B5DA33B0E6A3A9CEA2BFCEB0E620B5DA33D5C22E646F63>

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多

林子雨《C语言程序设计》讲义PPT

数据结构

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1A1D4F1>

内容简介 本书从结构化程序设计技术出发, 以 C 程序设计语言为载体, 以 Windows 下的 Visual C 为程序调试和运行平台, 通过对典型实例的算法及相应 C 语言代码的描述, 介绍了在程序设计过程中如何对问题进行分析 如何组织数据和如何描述解决问题, 揭示了在计算机应用过

當 地 情 形 還 不 熟 悉 4 得 勝 的 歡 似 虎 : 形 容 因 勝 利 而 得 意 忘 形 5 不 吃 無 工 之 食 : 比 喻 人 不 能 無 緣 無 故 接 受 優 待 或 贈 與 4. 請 根 據 文 意, 在 中 填 入 正 確 的 成 語 代 號 ( 甲 ) 優 游 自 在

Microsoft Word - CPE考生使用手冊 docx

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Microsoft PowerPoint - string_kruse [兼容模式]


FZUBRIDGE

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

C/C++ - 文件IO

新・明解C言語入門編『索引』

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

山东建筑大学学分制管理规定(试行)

// 语句序列 根据以上分析写出一个完整的程序, 并在集成开发环境编译执行 运行结果如下 : 请输入摄氏温度 C: 26.5 摄氏温度 C=26.5 华氏温度 F=79.7 #include<iostream> double C,F; cout<<" 请输入摄氏温度 C:\n"; cin>>c; F

2.1 信息存储 2016 年 3 月 3 日 9:32 1. 把位组合在一起, 再加上某种解释, 即给不同的可能位模式赋予含义, 我们就能够表示任何有限 集合的元素 2. 无符号编码基于传统的二进制表示法, 表示大于或者等于零的数字 ; 补码编码是表示有符号整数的最常见的方式, 有符号整数就是可以

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 10 模板 Template.pptx

2015年计算机二级(C语言)模拟试题及答案(三)

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

Microsoft Word - 文前.doc

一、单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项)

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

untitled

51 C 51 isp 10 C PCB C C C C KEIL

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th

Microsoft Word - 正文.doc

幻灯片 1


!"# $% & $%%% ( ")*+,-./00-(11.-. $%! $ " # $ % & ( - ) +%23!"# $%%% %,.%,!" $%.! 1.% & /$ 3(,. ( /0% $%%% ( $%%% ( 3 5 /6%%%! ")*+,-./00-(11

!! "!! "! "!! "! "! "!!#$% & ()*+, -./!000$ 1-2$##0! 3

A.68 B.70 C.80 D.100 答 案 A 解 析 丁 产 品 的 可 变 现 净 值 =110-2=108( 万 元 ), 成 本 =100+40=140( 万 元 ), 可 变 现 净 值 低 于 成 本, 产 品 发 生 的 减 值, 所 以 丙 材 料 的 可 变 现 净 值 =1

第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1

$$% % $ (%) % %$ $ ( *+,)(-)-./0-1//0- %) %) % - $%2)33%0 $ % ((3./. 3/3 )3 / % (()33(1 % (()3(/ %89856%:;< % (()3 0()0 3 (. <<=330(<</ 3 3. ()

untitled

第一章三角函数 1.3 三角函数的诱导公式 A 组 ( ) 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角, 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C 2 ( 中诱导公式 ) ( ) B. cos(

Chapter12 Derived Classes

Microsoft Word - oracle-排版文件.doc

2 A

内容简介本书主要内容包括程序设计基础知识 C 语言数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件等, 通过对大量实例进行分析, 力求提高和培养学生的程序设计能力 本书有配套辅导教程 程序设计基础实训指导教程 C 语言 ( 科学出版社出版 ), 引导读者学习和巩固各章节内容

2016 年 地 质 工 程 系 教 学 工 作 安 排 2016 学 年 我 系 将 在 总 结 过 去 工 作 的 基 础 上, 结 合 今 年 学 院 以 抓 质 量 强 内 涵 促 改 革 调 结 构 建 品 牌 细 管 理 重 过 程 为 宗 旨, 以 规 范 管 理 深 化 内 涵 为

<4D F736F F D203136BCADBBD8D2E4D3EBD1D0BEBF2E646F63>

萧山中学课程建设方案.doc


Microsoft Word - 9pinggb_A4.doc

Microsoft Word - 9pinggb_A4-f4.doc

理 论 探 索 事 业 单 位 改 革 的 五 点 思 考 余 路 [ 摘 要 ] 事 业 单 位 改 革 是 中 国 改 革 的 重 要 环 节, 其 影 响 力 和 难 度 不 亚 于 国 有 企 业 改 革 本 文 着 重 围 绕 推 进 事 业 单 位 改 革 应 考 虑 的 五 个 方 面

日 本 位 于 亚 洲 东 部, 太 平 洋 西 北 角, 是 我 国 东 方 的 一 个 岛 国 在 洪 积 世 ( 注 1) 的 大 部 分 时 期 内, 日 本 与 大 陆 相 连 大 约 在 洪 积 世 晚 期 至 冲 积 世 ( 注 2) 初 期, 日 本 各 地 发 生 海 进, 出 现

2深化教育教学改革、创新人才培养模式


Microsoft Word - 9pinggb_let.doc

实 习 上 下 点 表 格 解 释 和 相 关 纪 律 要 求 : 1 表 格 中 所 有 名 词 都 为 简 称, 包 括 医 院 名 称 四 年 级 五 年 级 各 专 业 名 称 等 所 有 时 间 都 为 学 生 装 好 行 李 出 发 时 间, 请 提 前 0 分 钟 将 行 李 运 到

3 基 金 杠 杆 从 分 级 基 金 的 概 念, 我 们 知 道 了 分 级 基 金 的 A 份 额 是 每 年 获 得 固 定 收 益 的 稳 健 份 额,B 份 额 是 具 有 杠 杆 效 应 的 激 进 份 额 分 级 基 金 中 的 杠 杆 一 般 有 三 类 : 份 额 杠 杆 =(A

简报158期.doc

Transcription:

计算概论 A 程序设计部分 C 语言的构成成分 运算成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn

C 语言中的运算符 C 语言的运算符范围很宽 求字节数运算符 : sizeof 下标运算符 [ ] 赋值运算符 = 算术运算符 + - * / % 关系运算符 < > == >= <=!= 逻辑运算符! && 条件运算符? : 逗号运算符, 位运算符 >> ~ ^ & 指针运算符 *,& 强制类型转换运算符 : ( 类型 ) 分量运算符.

当 : 两边类型不同 赋值运算总结 自动完成类型转换! 当 : 长数赋给短数 截取长数的低位送给短数! 当 : 短数赋给长数 原来是什么数, 现在还是什么数! 当 : 符号位的赋值处理 直接赋值, 不管符号位还是数字位!

什么是表达式 表达式 程序中由运算符 操作数和括号组成等所组成的计算式, 是计算求值的基本单位 a * b + c; 123 < 10; a *3.14f == 1; a = b; 表达式是有 值 的, 赋值语句也不例外 ; int main() { int i = 0; cout << (i = 10) << endl; cout << (i = i + i) << endl; return 0; }

复合的赋值运算 赋值表达式 在赋值符号前加上其它运算符号则构成复合赋值运算 ; 例如 : a + = 3; 等价于 a = a + 3; x * = y + 8; 等价于 x = x * ( y + 8 ); x % = 3; 等价于 x = x % 3;

赋值表达式 连续的赋值运算 自右而左的结合顺序 a = b = 5; //a, b 均为 5 a = b = c = 5; //a, b, c 均为 5 int a=b=c=5; // 编译错! a = (b = 4) + (c = 6); //a 为 10, b 为 4, c 为 6 举例 :

赋值运算符 = 赋值运算符 给赋值号左边的变量赋予数值 在变量定义的同时可以为变量赋初值 如 : int a=3; 相当于 : int a; a=3; int a, b, c = 5 表示只给 c 赋初值 相当于 int a, b, c; c = 5; int a = b = c = 5; ( Is this right? )

要点一 : 两边类型不同 赋值运算符 若 = 两边的类型不一致, 赋值时要进行类型转换 不管 = 右边的操作数是什么类型, 都要转换为 = 左边的类型 int main() { int int_i = 64.12345; char char_i = int_i; float float_i = char_i; bool bool_i = float_i; cout << showpoint << int_i << " " << char_i << " " << float_i << " " << bool_i << endl; return 0; }

赋值运算符 要点二 : 长数赋给短数 截取长数的低 n 位送给短数 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 int main() { char char_a = '; int int_i = 0x361; cout << hex << int_i << endl; char_a = int_i; cout << char_a << endl; return 0; } 0 1 1 0 0 0 0 1

举例 :short = long 赋值运算符 截取长整型数的低 16 位送给 short 字符 如果最高位为 1, 则得到负数, 否则得到正数 ; 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 int main() 1 0 1 0 1 0 1 0 { long int long_i = 0x2AAAAAAA; cout << long_i << endl; short short_j = long_i; cout << hex << short_j <<endl; cout << dec << short_j << endl; return 0; } 1 0 1 0 1 0 1 0

要点三 : 短数赋给长数 赋值运算符 最好处理的情况! 原来是什么数, 现在还是什么数! short int a = -1; int b = a; 计算机的处理过程 : 若 short 型数为无符号数 : short 型 16 位到 long 型低 16 位,long 型高 16 位补 0; 若 short 型数为有符号数 : short 型 16 位到 long 型低 16 位 ; 若 short 型最高位为 0, 则 long 型高 16 位补 0; 若 short 型最高位为 1, 则 long 型高 16 位补 1;

示例 #include <iostream> #include <iomanip> using namespace std; int main() { short short_i = -123; cout << hex << short_i << endl; int int_j = short_i; cout << hex << int_j <<endl; cout << dec << int_j << endl; return 0; }

signed 赋值运算符 要点四 : 符号位的赋值处理 unsigned 也很好处理的情况! 直接搬运! 直接赋值, 不管符号位还是数字位! 例如 : unsigned = int 或 long 直接赋值, 符号位当作数字 int = unsigned int 直接赋值, 数字当作符号位 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

signed 示例 #include <iostream> #include <iomanip> using namespace std; int main() { unsigned int unsigned_int_i = 0xAAAAAAAA; cout << unsigned_int_i << endl; signed int signed_int_j = unsigned_int_i; cout << hex << signed_int_j << endl; cout << dec << signed_int_j << endl; return 0; } 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 unsigned 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

当 : 两边类型不同 赋值运算总结 自动完成类型转换! 当 : 长数赋给短数 截取长数的低位送给短数! 当 : 短数赋给长数 原来是什么数, 现在还是什么数! 当 : 符号位的赋值处理 直接赋值, 不管符号位还是数字位!

算术运算符和算术表达式 算术运算符和算术表达式 基本的算术运算 + - * / % 注意 : % 是模运算, 即, 求余运算, 必须是整数 如 7 % 4 = 3 整数运算, 结果仍为整数 5/3 的结果仍是整数, 小数部分被忽略 实数运算, 结果为 double 型 5.3/3 或 5/3.0 的结果为 double 型 舍入的方向随编译器的不同而不同

算术运算符的优先级 ( ) * / % + - 算术表达式 在同一级别中, 采取由左至右的结合方向 如 :a b + c 相当于 ( a b ) + c 如 :a % b * c / d 相当于 (((a % b)*c))/d 当数据类型非常复杂时 如 :123%s + (i+ @ ) + i*u f/d 其中 short s; int i; float f; double d; unsigned u;

剪刀法求表达式的值 算术表达式 short s; int i; float f; double d; unsigned u; 123%s + (i+ @ ) + i*u f/d

计算过程中的类型转换 double float long unsigned int char, short

算术表达式 自增 自减运算符 : 使变量的值加 1 或减 1 ++i, --i 在使用 i 之前, 先将 i 的值加 ( 减 )1 i++, i-- 在使用 i 之后, 再将 i 的值加 ( 减 )1 例如 :i 的值为 3, 则 j = + + i; j = i + +; cout<<++i; cout<<i++;

举例 : 自增 自减运算符 设 i 的值为 3; 则 cout<<-i++<<endl; cout<<-++i<<endl; cout<<(-i)++<<endl; cout<<++i++<<endl; 注意 : + + 和 -- 只能用于变量

int main() { } 自增 自减运算符 int a = 0, b = 0, c = 2, d = 0, e = 2, f = 2; cout << a << " " << a++ << " " << endl; cout << ++b << " " << b++ << " " << endl; cout << c << " " << (c++) + (++c) << " " << endl; cout << (d = f++) + (e = f) << endl; cout << f << " " << d << " " << e << endl; return 0;

关系运算符 C 语言提供 6 种关系运算符 : 1 < ( 小于 ) 2 <= ( 小于或等于 ) 3 > ( 大于 ) 4 >= ( 大于或等于 ) 5 = = ( 等于 ) 6!= ( 不等于 ) 优先级相同 优先级相同 高 低

关系运算表达式 关系运算表达式的值 : 真 / 假 如 a = 3,b = 4 a > b 的值为 0 a!= b 的值为 1 a == b 的值为 0

运算符的优先级 算术运算符 高于 关系运算符 高于 赋值运算符 例如 : 1 + 2 % 3 * 4 > 5 / 6 7 1 + 2 % (3 * 4) > (5 / 6 7) = = 8 X = 1 + 2 % 3 * 4 > 5 / 6 7 = = 8 1>2= =3>4

逻辑运算符 三种逻辑运算符 : 逻辑与 && 逻辑或 R E A B F 逻辑非! 注 : 若 A B 为真, 则 F=A&&B 为真 R E A B F 若 A B 之一为真, 则 F=A B 为真 若 A 为真, 则!A 为假 E R A F

逻辑表达式的值 以 0 代表 假 ; 以非 0 代表 真 若 a = 4, 则! a 的值为 0 若 a = 4,b = 5, 则 a && b 的值为 1 若 a = 4,b = 5, 则 a b 的值为 1 若 a = 4,b = 5, 则!a b 的值为 1 表达式 4 && 0 2 的值为 1

逻辑表达式 逻辑运算符优先级 一个逻辑表达式中若包含多个逻辑运算符, 则按以下的优先次序 :! ( 非 ) && ( 与 ) ( 或 ), 即! 优先级最高 例如 :!a&&b c;! a && b x>y && c;! a && b x>y && c + 1;

逻辑非 (!) 例如 : 混合运算的优先级 高于 算术运算符 高于 关系运算符 高于 && 和 高于 赋值运算符 a>b && x>y 可写成 ( a>b ) && ( x>y ) a == b x == y 可写成 ( a ==b ) (x == y )! a a>b 可写成 (! a ) ( a>b )

思考题 #include<iostream> using namespace std; int main() { int a = 0, b = 0; a = 5 > 3 && 2 8 < 4 - (b =!0); cout<<a<<" "<<b; return 0; }

逻辑运算的取舍 逻辑表达式求解中, 并不总是执行所有的运算 只有在必须执行下一个逻辑运算符才能求出表达式的解时, 才执行该运算符! 对于表达式 a && b && c 只有 a 为真 ( 非 0) 时, 才需要判别 b 的值, 只有 a 和 b 都为真的情况下才需要判别 c 的值 对于表达式 a b c 只要 a 为真 ( 非 0), 就不必判断 b 和 c; 只有 a 为假, 才判别 b;a 和 b 都为假才判别 c

逻辑运算的取舍举例 #include<iostream> using namespace std; int main( ) { int i = 0, a = 1, b = 2, c = 3; i = ++a ++b c++; cout<<i <<" "<< a<<" "<<b<<" "<<c<<endl; return 0; }

运算对象的扩展 逻辑运算符两侧可以是任何类型 如 : 字符型 实型或指针型等 ; 系统最终以 0 和非 0 来判定它们, 例如 思考 : 'c' && 'd' c 和 d 的 ASCII 值都不为 0, 按 真 处理 a = = b &&! c

示例 #include<iostream> using namespace std; int main() { int a = 0, b = 1; a = 8>4 - (b =!'c') && 5>3 + 'a' % 6 == 'b'; cout<<a<<" "<<b; return 0; }

应用示例 问题 : 要判别某一年 year 是否闰年 闰年的条件是符合下面二者之一 : 1 能被 4 整除, 但不能被 100 整除 2 能被 100 整除, 又能被 400 整除 求解 : 可以用如下逻辑表达式来判别 year 是否为闰年 : ( year % 4 == 0 && year % 100! = 0 ) year % 400 == 0 也可以用如下逻辑表达式判别 year 是否非闰年 : ( year%4! = 0 ) ( year%100 == 0 && year%400! = 0)

逗号运算和逗号表达式 用逗号将两个表达式连起来 表达式 1, 表达式 2, 表达式 3, 表达式 n 先求表达式 1, 再求表达式 2,, 再求表达式 n, 整个表达式的值为表达式 n 的值 下式中是否相同? x=(a=3, 6 * 3); x=a=3, 6 * 3; a = 3 * 5, a * 4;

求值规则 : 条件运算符 表达式 1? 表达式 2 : 表达式 3 如果表达式 1 的值为真, 则以表达式 2 的值作为条件表达式的值 ; 否则以表达式 3 的值作为整个条件表达式的值 相当于 : max = ( a > b )? a : b ; if( a > b ) max = a ; else max = b ;

形式 : ( 类型名 )( 表达式 ) 举例 : (double)a (int)(x+y) (float)(5/3) 注意 : 强制类型转换 将 a 的值转换成 double 类型 将 x+y 的值转换成 int 类型 将 5/3 的值转换成 float 类型 强制类型转换后, 被转换的量的类型并没有发生变化

选讲内容 位运算

位运算 位运算 所谓位运算是指进行二进制位的运算 C++ 语言中的位运算符 按位与 (&) 双目运算符 按位或 ( ) 双目运算符 按位异或 (^) 双目运算符 取反 (~) 单目运算符 左移 (<<) 单目运算符 右移 (>>) 单目运算符

位运算符 (1) 按位与 运算符 (&) 参加运算的两个数据, 各位均独立进行 与 运算 例如 : 对于表达式 :a = 3 & 5, 有 : 3 = 00000011 (&) 5 = 00000101 00000001 因此,3&5 的值为 :1

位运算符 (2) 按位或 运算符 ( ) 参加运算的两个数据, 各位均独立进行 或 运算 例如 : 对于表达式 :a = 3 5, 有 : 3 = 00000011 ( ) 5 = 00000101 00000111 因此,3 5 的值为 :7

异或 运算符 ( ) 位运算符 (3) 异或运算符 也称 XOR 运算符 参加运算的两个数, 各位均独立进行异或运算 : 即 0 0 = 0;0 1 = 1;1 0 = 1;1 1 = 0; 例如 : 00111001 ( 十进制数 57, 八进制数 071) ( ) 00101010 ( 十进制数 42, 八进制数 052) 00010011 ( 十进制数 19, 八进制数 023) 即 071 052, 结果为 023( 八进制数 )

位运算符 (4) 取反运算符 ~ 是一个单目 ( 元 ) 运算符, 用来对一个二进制数按位取反, 即将 0 变 1,1 变 0 例如 : (~) 000000000010101 111111111101010 因此,~(025) 8 的值为 (177752) 8

位运算符 (5) 左移运算符 (<<) 用来将一个数的各二进位全部左移若干位 高位左移后溢出, 舍弃不起作用 若 a=15, 即二进制数 00001111, 左移 2 位得 00111100, 即十进制数 60 a = a<<2 左移 1 位相当于该数乘以 2, 左移 2 位相当于该数乘以 2 2 =4 只适用于该数左移时被溢出舍弃的高位中不包含 1 的情况

右移运算符 (>>) 位运算符 (6) 用来将一个数的各二进位全部右移若干位 移到右端的低位被舍弃, 对无符号数, 高位补 0 若 a=15, 即二进制数 00001111, 右移 2 位得 00000011, 即十进制数 3; a = a >> 2 当没有非零数位被抛弃时, 右移一位相当于除以 2, 右移 n 位相当于除以 2 n

关于位运算的几个问题 (1) 右移运算符号位的处理 对无符号数, 右移时左边高位移入 0 对于有符号的值, 若原来符号位为 0( 该数为正 ), 则左边移入 0; 若符号位原来为 1( 即负数 ), 则左边移入 0 还是 1, 要取决于所用的计算机系统 若移入 0, 称为 逻辑右移 或 简单右移 若移入 1, 称为 算术右移 (VC)

关于位运算的几个问题 (2) 不同长度的数据进行位运算 如果两个数据长度不同进行位运算时, 系统会将二者按右端对齐 如 a & b, 而 a 为 int 型,b 为 short 型 如何补位 如果 b 为无符号整数型, 则左侧添满 0 如果 b 为有符号整数型 : 如果 b 为正数, 则左侧 16 位补满 0 如果 b 为负数, 则左端 16 位补满 1

关于位运算的几个问题 (3) 位运算赋值运算符 位运算符与赋值运算符可以组成复合赋值运算符如 : &=, =, >>=, <<=, = a & = b 相当于 a = a & b a = b 相当于 a = a b a >> =2 相当于 a = a >> 2 a << =2 相当于 a = a << 2 a = b 相当于 a = a b

关于位运算的几个问题 (4) 算符优先级 取反运算符 ~ 算数运算符 左移 << 右移 >> 关系运算符 按位与 & 按位异或 ^ 按位或 逻辑运算符 高 低

按位与 运算的用途 位运算的使用 (1) 任意存储单元与 0 进行 按位与 运算可清零 ; 取一个数中某些指定位 如有一个整数 a, 想要其中的低字节 只需将 a 与 (377) 8 按位与即可 按位或 运算 对一个数据的某些位取定值为 1;

异或 运算符的使用 (1) 使特定位翻转 位运算的使用 (2) 使 01111010 低 4 位翻转 ( 即 1 变为 0,0 变为 1) 可将其与 00001111 进行 运算, 即 : 01111010 ( ) 00001111 01110101 (2) 使特定位保持不变 与 0 相, 保留原值如 012 00=012 00001010 ( ) 00000000 00001010

异或 运算符示例 交换两个值, 而不必使用临时变量 假如 a = 3,b = 4 想将 a 和 b 的值互换, 可以用以下赋值语句实现 : a = a b; b = b a; a = a b; 设 :a = 3, b = 4 a=011 ( ) b=100 ( ) b=100 ( ) a=111 a=111 (a b 的结果,a 已变成 7) b=011 (b a 的结果,b 已变成 3) a=100 (a b 的结果,a 变成 4)