C语言:位操作

本文详细介绍了C语言中的位操作,包括位运算符(按位与、按位或、按位异或、按位取反)、移位运算符(左移、右移)及其在编程中的应用,如位字段、掩码技术和对齐特性等,帮助理解位操作在二进制数处理中的作用。
摘要由CSDN通过智能技术生成

位操作

运算符:~、&、|、、>>、<<、&=、|=、=、>>=、<<=

二进制、十进制、十六进制

位运算符位字段

_Alignas _Alignof

二进制、位和字节

计算机适用基底为2的数制系统。它用2的幂而不是10的幂。以2为基 底表示的数字被称为二进制数(binary number)。二进制中的2和十进制中 的10作用相同。例如,二进制数1101可表示为:

1×2^3 + 1×2^2+ 0×2^1+ 1×2^0

以十进制数表示为:1×8 + 1×4 + 0×2 + 1×1 = 13

用二进制系统可以把任意整数(如果有足够的位)表示为0和1的组合。 由于数字计算机通过关闭和打开状态的组合来表示信息,这两种状态分别用 0和1来表示,所以使用这套数制系统非常方便。

二进制整数

通常,1字节包含8位。C语言用字节(byte)表示储存系统字符集所需 的大小,所以C字节可能是8位、9位、16位或其他值。不过,描述存储器芯片和数据传输率中所用的字节指的是8位字节(计算机界通常用八位组(octet)这个术语特指8位字节)。

可以从左 往右给这8位分别编号为7~0。在1字节中,编号是7的位被称为高阶位 (high-order bit),编号是0的位被称为低阶位(low-order bit)。每 1位的 编号对应2的相应指数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nuh8AGdJ-1589358158972)(image/2020-05-13-10-44-35.png)]

这里,128是2的7次幂,以此类推。该字节能表示的最大数字是把所有 位都设置为1:11111111。这个二进制数的值是:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

而该字节最小的二进制数是00000000,其值为0。因此,1字节可储存0 ~255范围内的数字,总共256个值。或者,通过不同的方式解释位组合 (bit pattern),程序可以用1字节储存-128~+127范围内的整数,总共还是 256个值。例如,通常unsigned char用1字节表示的范围是0~255,而signed char用1字节表示的范围是-128~+127。

有符号整数

如何表示有符号整数取决于硬件,而不是C语言。也许表示有符号数最 简单的方式是用1位(如,高阶位)储存符号,只剩下7位表示数字本身(假设储存在1字节中)。用这种符号量(sign-magnitude)表示法,10000001表 示−1,00000001表示1。因此,其表示范围是−127~+127

这种方法的缺点是有两个0:+0和-0。这很容易混淆,而且用两个位组 合来表示一个值也有些浪费。

*二进制补码(two’s-complement)*方法避免了这个问题,是当今最常用的系统。

二进制补码用1字节中的后7 位表示0~127,高阶位设置为0。目前,这种方法和符号量的方法相同。另 外,如果高阶位是1,表示的值为负。这两种方法的区别在于如何确定负 值。从一个9位组合100000000(256的二进制形式)减去一个负数的位组 合,结果是该负值的量。例如,假设一个负值的位组合是 10000000,作为 一个无符号字节,该组合为表示 128;作为一个有符号值,该组合表示负值 (编码是 7的位为1),而且值为100000000-10000000,即 1000000(128)。因此,该数是-128(在符号量表示法中,该位组合表示 −0)。类似地,10000001 是−127,11111111 是−1。该方法可以表示−128~ +127范围内的数。

要得到一个二进制补码数的相反数,最简单的方法是反转每一位(即0 变为1,1变为0),然后加1。因为1是00000001,那么−1则是11111110+1, 或11111111。

二进制浮点数

浮点数分两部分储存:二进制小数和二进制指数。

  1. 二进制小数

一个普通的浮点数0.527,表示如下:

5/10 + 2/100 + 7/1000

从左往右,各分母都是10的递增次幂。在二进制小数中,使用2的幂作 为分母,所以二进制小数.101表示为:

1/2 + 0/4 + 1/8

用十进制表示法为:

0.50 + 0.00 + 0.125

即是0.625。

许多分数(如,1/3)不能用十进制表示法精确地表示。与此类似,许 多分数也不能用二进制表示法准确地表示。实际上,二进制表示法只能精确 地表示多个1/2的幂的和。因此,3/4和7/8可以精确地表示为二进制小数,但 是1/3和2/5却不能。

  1. 浮点数表示法

为了在计算机中表示一个浮点数,要留出若干位(因系统而异)储存二 进制分数,其他位储存指数。一般而言,数字的实际值是由二进制小数乘以 2的指定次幂组成。例如,一个浮点数乘以4,那么二进制小数不变,其指数 乘以2,二进制分数不变。如果一份浮点数乘以一个不是2的幂的数,会改变 二进制小数部分,如有必要,也会改变指数部分。


其他进制数

八进制

八进制(octal)是指八进制记数系统。该系统基于8的幂,用0~7表示 数字(正如十进制用0~9表示数字一样)。例如,八进制数451(在C中写 作0451)表示为:

4×8^2+ 5×8^1+ 1×8^0= 297(十进制)

了解八进制的一个简单的方法是,每个八进制位对应3个二进制位。
[外链图片转存失败,源站可能有防盗链机制,建议将

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值