C语言位运算操作整理记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、按位与运算的用途
    • 1.清零
    • 2.取一个数中国某些指定位的值
  • 二、按位或运算的用途
    • 1.置位
  • 三、异或运算的用途
    • 1.使特定的位翻转
    • 2.与0相^,保留原值
    • 3.交换两个值,不用临时变量(新鲜!)
  • 四、取反运算符
  • 五、左移运算符
  • 六、右移运算符
  • 七、位段
  • 总结

一、按位与运算的用途

1.清零

若想对一个存储单元清零,即使其全部的二进制为为0。只要找到一个二进制数,其中的各个位符合以下的条件就能够达到清零的目的。
(1)、原来的数中为1的位,新数字中相应位置为0;
(2)、使二者进行&运算。

2.取一个数中国某些指定位的值

需要对一个数据取出其中低8位的值时,可以这么做:
(1)、找一个数,确保想要保留的位上的数据为1,不想要的位上的数据位0;
(2)、使二者进行&运算。

二、按位或运算的用途

1.置位

类似与按位与,不详述。

三、异或运算的用途

异或运算符^也称为XOR运算符。它的规则是:相同为0,不同为1。跟数电的规则一样,当两个操作数,对应的二进制位同号,则结果为0,异号则结果为1。

1.使特定的位翻转

设有一二进制数,01111010,想使其低4位翻转,则可以将它与00001111,进行^运算,即:
01111010 ^ 00001111。

2.与0相^,保留原值

例如:00001010 ^ 00000000 = 00001010;原理:原数中的1与0进行^运算,得1。0和0进行异或运算得0。

3.交换两个值,不用临时变量(新鲜!)

一般而言,都是通过临时变量,将临时变量用于交换两个值时的中间“仓储”,然后分别去改变待交换数据的两个数。
通过异或操作也可以实现两个数据的交换,并且不使用临时变量。

//这种方式常用于加密算法,可以进行逆运算
a = a ^ b;
b = b ^ a;
a = a ^ b;

上述操作的分析如下:
要做分析,首先要知道异或操作是满足逆运算的条件的。在这个条件下,注意如下的分析步骤:

a = a ^ b;

首先,先得到a和b的异或运算的结果;

b = b ^ a;

然后,用结果和b进行异或运算,这实际上就是反求得到了a,但是这里的结果是给了b,实现了交换的第一步,即把a的值给b;

a = a ^ b;

接着,再用结果和b进行异或运算,这是,b已经是最早求异或之前a的值了,所以这里相当于是求出了b,即把b的值给了a;
综上,就完成了两个整型数值的交换,但是没有经历过中间变量,这里的关键就是利用了异或的运算性质——XOR是可以进行逆运算的。

四、取反运算符

~是一个单目运算符,用来对一个二级制数按位进行取反。

五、左移运算符

需要注意的点有:
将一个数的各二进制位全部左移若干位,同时右边补0,如果高位左移后发生溢出,则舍弃。但是要注意的是,溢出位如果是“1”这种有效位,一旦产生溢出,就是不再是满足左移1位是乘2,这个条件了。

六、右移运算符

右移运算符,标志将一个数的各二进制位右移2位,移到右端的低位被舍弃,对于无符号数,高位补0,这时右移相当于除法(/2);
对于有符号数,如果符号位原来是1,则左移入后,高位补0还是1,要取决于所使用的计算机系统,有的系统是补0,有的系统是补1。
移入0的称为逻辑右移,移入1的称为算数右移。
举个例子:
设定:a = -2;
则a的二进制形式表示为:a = 111111110;(负数在计算机系统中,采用补码的形式:除符号位外,其余各位按位取反,然后+1)
则上述:
对于无符号数:a>>1:01111111(逻辑右移);
对于有符号数:a>>1:11111111 (算数右移); //-1

七、位段

C语言中,允许在一个结构体中以位为单位来指定其内部成员所占的内存宽度,这种以位为单位的成员称为“位段”或称为“位域”(bit field)。利用位域能够用较少的位数存储数据。
这里要说明的是:位段成员的类型必须指定为unsigned或int类型;同时如果某一个位段要从另一个字开始存放,可以使用长度为0的位段:unsigned:0;这种形式(可以定义无名位段)。通过0长度的位段,能够将位段里面的变量分段进行存放。
位段在使用的时候,会被被系统自动的转换为整型数。

总结

二进制为操作相关的整理记录。

你可能感兴趣的:(c语言,开发语言)