关于位运算相关内容分为两个大博文,分别为位运算1,即该博文;主要介绍二进制、位、字节的基本概念、进制转换问题,以及C的~
&
|
^
按位运算符及应用方法
由于篇幅限制,位运算2主要讲述左移和右移运算及编程练习以及字段运算
文章目录
0.引入
0.1 位运算的应用方向
- 想硬件设备发送一两个字节来控制这些设备,其中每个位(bit)都有特定含义
- 与文件相关的操作系统信息经常被存储,通过使用特定位表明特定项
- 许多压缩和加密操作都是直接处理单独的位
通过应用可以看出,位运算主要应用在计算机软件与硬件交互的过程中使用,或者可以说是更底层的东西
C语言也是编写设备驱动程序和嵌入式开发的首选语言
0.2 二进制数、位和字节
二进制数(binary number):
以2为基底表示的数字被称为二进制数
例如二进制数1101可表示为:1x23+1x22+0x21+1x20
二进制系统可以把任意整数表示为0和1的组合,关于进制转换问题请参考博文进制转换相关内容
0.2.1 二进制整数
通常,1字节包含8位。C语言用字节(byte)表示存储系统字符集所需的大小
所以C字节可能是8位、9位、16位或其它值。但是,描述存储器芯片和数据传输率中所用的字节指的是8位字节。
本博文内容假设1字节=8位
通常用用术语 八位组(octet) 这个术语特指8位字节
计算机中从左往右给八位分别变好7~0。编号为7的成为高阶位(high-order bit) ,编号是0的位称为低阶位(low-oder bit) 每一位对应2的相应指数
如上图,1字节能表示的最大数字为11111111
其对应的十进制值为255
11111111=1x27+1x26+1x25+1x24+1x23+1x22+1x21+1x20=255
因此1字节可以存储0~255范围内的数字,总共256个值
对于unsigned char 中1字节存储范围为0~255,
对于signed char 中1字节表示范围为-128~+127
0.2.2 有符号整数
如何表示有符号整数取决于硬件,而不是C语言。一般地,C中用高阶位状态1表示负数,高阶位0表示正数
针对具体数的表示问题上及硬件关系,提出数的源码、反码、补码表示方法,具体请参见博文源码、反码、补码部分
0.2.3 二进制浮点数
浮点数分为两部分存储:二进制小数和二进制指数
1. 二进制小数表示方法
.101
的二进制表示为:1/21+0/22+1/23
.101
的十进制表示为:1/2+0/4+1/8=0.5+0+0.125
即,.101对应的十进制值为0.625
可以看出,二进制的表示法以2的指数进行计算,即二进制表示法只能精确的表示多个1/2的幂的和。
3/4和7/8可以精确的表示为二进制小数,但1/3和2/5却不能
2. 浮点数表示方法:
(此处没有理解)
1. 其它进制数
其它进制数包括八进制和十六进制数,相关内容参看博文:八进制、十六进制部分
2. C按位运算符
C中有两个操作位的工具。第一个工具为一套(6个)作用于位的按位运算符,第二个工具是字段(field) 数据形式,用于访问int中的位。该部分将介绍相关按位运算符。
按位运算符分为两类:一类是按位逻辑运算符,另一类是位移运算符
2.1 按位逻辑运算符
对于按位逻辑运算符请注意:
- 4个按位逻辑运算符都用于整型数据,包括char
- 按位(bitwise)运算是因为这些操作都是只针对每一位进行操作,而不影响它的左右两边的位。
- 不要把按位运算符于常规的逻辑运算符混肴,常规的逻辑运算符操作的是整个值
<