`

C语言位操作初步

阅读更多

位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作。

位操作允许程序员设置、清除、测试与其他的操作,这些操作如下表:

操作 含义
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移

这些操作用于整型或者字符型

1、按位与(&)

Bit1 Bit2 Bit1 & Bit2
0 0 0
0 1 0
1 0 0
1 1 1

通常我们可把按位“与”操作 & 作为关闭某位(即将该位置0)的手段,例如我们想要关闭a数中的第3位,而又不影响其它位的现状,可以用一个数0xF7,即二进制数1111 0111去与a数作按位“与”运算:
    0x88 1000 1000 a数
& 0xF7 1111 0111 屏蔽数
   =       1000 0000

注意,这个数除第3位为0外,其它各位均为1,操作的结果只会将a数中的第3位置0,而a数的其它位不受影响。也就是说,若需要某个数的第n位关闭,只需要将该数与另一个数按位相与,另一个数除了相应的第n位为0外,其它各位都为1,以起到对其它各位的屏蔽作用。

应用举例:判断一个数字的奇偶性

由于在二进制下,当最后一个数字为0,则此数字为偶数,若为1则此数为奇数

代码如下:

int even(const int value)
{
    return ((value & 1)==0);
}

 

2、按位或(|)

Bit1 Bit2 Bit1 | Bit2
0 0 0
0 1 1
1 0 1
1 1 1

通常我们可把按位“或”操作 | 作为置位(即将该位置1)的手段,例如我们想要将a数中的第0位和1位置1,而又不影响其它位的现状,可以用一个数0x03,即二进制数00000011去与a数作按位“或”运算:

  0x88 1000 1000 a数
| 0x03 0000 0011 屏蔽数
   =     1000 1011

注意,这个数除第0、1位为1外,其它各位均为0,操作的结果只会将a数中的第0、1位置1,而a数的其它位不受影响。也就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相“或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用

3、按位异或(^)

Bit1 Bit2 Bit1 ^ Bit2
0 0 0
0 1 1
1 0 1
1 1 0

 

按位“异或”运算 ^ 具有一些特殊的应用,介绍如下:

① 按位“异或”运算可以使特定的位取反
例如:我们想让a数中的最低位和最高位取反,只要用0x81,即二进制数10000001去与它作按位“异或”运算,其运算结果同上式。经过操作后,最高位的值已经由1变0,而最低位的值也已经由0变1,起到了使这两位翻转的效果。其它位的状态保持不变。
可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第0、7位取反,而a数的其它位不受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相“异或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a ^ (0x81) 来表示,也可以用a ^ =(0x81) 来表达。

② 直接交换两个变量的值
例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:
a ^ = b
b ^ = a
a ^ = b

首先,a ^ = b:
    a 0000 0011
^ b 0000 0100
a = 0000 0111

其次,b ^ = a:
    b 0000 0100
^ a  0000 0111
b =  0000 0011

最后,a ^ = b:
    a 0000 0111
^ b  0000 0011
a =  0000 0100

这样,a、b两个变量中的值就进行了对调。

4、按位取非(~)

Bit ~Bit
0 1
1 0

5、左移操作(<<)与右移操作(>>)

对于x,x<<n相当于x^n,x>>n相当于x/(2^n)

6、右移操作详解:

右移操作相当的诡异,当一个变量进行右移操作,C语言需要填充左边空的比特位

然而对于有符号变量,C使用符号位,如下表:

  signed char signed char unsigned char
表达式 9>>2 -8>>2 248>>2
Binary Value>>2 0000 1010>>2 1111 1000>>2 1111 1000>>2
结果 ??00 0010 ??11 1110 ??11 1110
填充 Sign Bit(0) Sign Bit(1) 0
最终结果(二进制) 0000 0010 1111 1110 0011 1110
最终结果(短整型) 2 -2 62
分享到:
评论

相关推荐

    C语言基础培训ppt

    内容包括:C语言基础、变量和数据类型、运算符、条件结构、循环结构、数组、指针、函数、字符串、结构体、编译预处理、位运算、数据结构和算法初步、编译与运行、高质量变成规范、文件操作、软件漏洞、链表

    C语言入门经典(第4版)--源代码及课后练习答案

     本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介  本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一。本书集综合性、实用性为一体,是学习C语言...

    新概念C语言.李一波(带详细书签).pdf

    第17章 自加、自减、逗号和位操作符和条件表达式构成的选择结构 177 17.1 自加(++)、自减(--)运算符和逗号运算符 177 17.2 复合的赋值表达式 178 17.3 逗号运算符和逗号表达式 178 17.4 位运算 178 17.4.1 ...

    [新概念C语言].李一波.扫描版

    第17章 自加、自减、逗号和位操作符和条件表达式构成的选择结构 第18章 其他普量类型、变量的作用域、变量的存储类别和编译预处理 第19章 C++对C的扩充 第20章 C++的面向对象基础 附录及参考文献 参考文献

    C语言程序设计实验报告

    CSU 大一上 C语言实验报告 (1)教材第2章编程题第2题:编写计算球体体积的程序。 说明:本题声明适当变量,用户键入数据,运算并输出结果,较简单。 (2)教材第2章编程题第8题:编写程序计算第一、第二、第三月...

    C语言课程设计通讯录管理系统.docx

    数据描述 以所示的文本数据位初始数据进行简单操作,也可另行添加。 功能需求 实现以上功能需求。 性能需求 能够进行简单的数据处理。 具有对新信息处理打印打能力。 运行需求 C语言课程设计通讯录管理系统全文共44...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 193 12.1.5 左移运算 193 1012.1.6 右移运算 193 12.2 位域(位段) 194 12.3...

    单片机的C语言程序设计与应用课程教学大纲.doc

    教学时数: 8学时 教学内容: 3.1 单片机的并行口(2学时) 介绍51单片机的4个并行I/O口的特点,了解每个端口既可以按字节单独使用,也可以 按位操作,各个端口可作为一般的I/O口使用,大多数端口又可以作为第二...

    手把手教你学AVR单片机C程序设计(光盘)

    第1章 概述 1.1 采用C语言提高编制单片机应用程序的效率 1.2 C语言具有突出的优点 1.3 AvR单片机简介 1.4 AvR单片机的C编译器简介 第2章 学习AVR单片机C程序设计所用的软件及...第18章 C++语言开以AVR单片机初步

    C语言设计报告(电子通讯录).doc

    四、功能模块函数设计和调试 ……………………………… 五、程序清单…………………………………………………… 六、课程设计总结 …………………………………………… 一、引言 通过使用C语言编程实现通讯录管理...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    12.1 位运算符C语言提供了六种位运算符: 189 12.1.1 按位与运算 191 12.1.2 按位或运算 192 12.1.3 按位异或运算 192 12.1.4 求反运算 193 12.1.5 左移运算 193 1012.1.6 右移运算 193 12.2 位域(位段) 194 12.3...

    程序设计基础(C) 视频.txt

    1.3.7位操作运算符18 1.3.8其他运算符20 1.3.9数据类型转换21 1.3.10类型别名22 1.4面向对象设计思想及其实例23 1.4.1程序设计语言的发展23 1.4.2面向过程的程序设计(pop)思想23 1.4.3面向对象的程序设计(oop)思想24...

    自己动手写操作系统(含源代码).part2

    在读完本书后,你不但可以获得对于操作系统初步的感性认识,并且对 IBMPC的接口、IA架构之保护模式,以及操作系统整体上的框架都将会有一定程度的了解。 笔者相信,当你读完本书之后,如果再读那些纯理论性的操作...

    自己动手写操作系统(含源代码).part1

    在读完本书后,你不但可以获得对于操作系统初步的感性认识,并且对 IBMPC的接口、IA架构之保护模式,以及操作系统整体上的框架都将会有一定程度的了解。 笔者相信,当你读完本书之后,如果再读那些纯理论性的操作...

    ARM的三种中断调试的方法

    编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。 对后四种文件的理解很...

    C 程序指导书及实践指导

    实验一 C语言程序初步 2 实验二 数据类型、运算符和表达式 3 实验四 循环结构(1) 6 实验五 循环结构(2) 9 实验六 函数(1) 12 实验七 函数(2) 14 实验八 数组(1) 16 实验九 数组(2) 19 实验十 指 针 (1) 22 实验十一 ...

    PROTEUS--跑马灯--单片机课程设计.doc

    当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数 据总线传送。8255的地址选择线A1、A0分别与AT89C52的P2.7和P2.6连接,通过定义 不同的地址来定义8255芯片PA口和PB口的工作方式...

    编程新手真言......

    4.22 位操作与多维数组指针与元素 101 4.23 变量与VOID 102 第5章 抽象 102 5.1 人与软件 103 5.2 软件活动的特点 103 5.2 抽象与接口 104 5.3 过度抽象 105 5.3 OO为什么不是银弹 - 过度抽象与抽象偏差 106 5.4 ...

    详解嵌入式系统中的三种中断调试方法.rar

    编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。   对后四种...

Global site tag (gtag.js) - Google Analytics