c 语言位运算简介-位运算详解


位运算简介

在程序中数据是按字节的形式存储,在计算机底层,数据是按二进制的形式存储在计算机的物理设备上。
例:
字符串 ‘B’ 在内存中的存储形式为:

0

1

1

1

1

0

1

0

按照计算机编码规则,字符B首先需要转换为ASCII码,然后再转换为二进制,不足位数前面需补零。

我们把二进制的运算称之为位运算。
由于c语言拥有位运算的特性,所以我们可以采用位运算的特性从底层来操作计算机。
c语言位运算包括以下几种运算方式:
1: &(按位与) —注意逻辑与为两个&&
2: |(按位或) —注意逻辑或为两个||
3: ^(按位异或)
4: >>(二进制右移)
5: <<(二进制左移) 6: ~(按位取反) 参加位运算的类型必须为整型或字符型,如果所输入的类型不是这些类型,那么将遵循c语言一般转换规则



一、按位与计算

按位与同逻辑与有着类似之处,当两个位数都是1时,则得1 ,否则结果为0
例:
int a1=0x84;int a2=ox90;int a3;
a3 =a1&a2;
a3 =0x80;
将a1 a2 转换为二进制

a1

10000100
a2

10010000
a3

10000000

按位取与可以将两个数之间,只有一个为1的位数据清零。

二、按位或运算

按位或的功能就是当两个都为0,结果位0,否则为1;
例:
int a1=0x84;int a2=ox90;int a3;
a3 =a1|a2;
a3 =0x94;
将a1 a2 转换为二进制

a1

10000100
a2

10010000
a3

10010100

按位取或常用于:
加入我们需要保证一个数字的低4位为1时,我们可以采用一个低四位都位1的数同这个数字进行位或计算,就可以保证低四位全部为1。

三、按位异或

按位异或的功能就是,两个数的二进制位进行一一运算时,此时检测 一个为1 一个为0 得到结果为1,否则为0。
例:
int a1=0x84;int a2=ox90;int a3;
a3 =a1^a2;
a3 =0x14;
将a1 a2 转换为二进制

a1

10000100
a2

10010000
a3

00010100

按位异或可以用于按位取反操作。
a1 =0x84; a2=0x0F; a3=0x8C;

根据按位异或的属性,我们可以看出一个数同0异或得到本身,与自身异或得到0;
在我们交换变量时,我们就可以采用
int a1=0x85;int a2=0x90;
a1=(a1^a1)^a2;
a2=(a2^a2)^a1;



四、二进制右移运算

当二进制进行右移运算时,遵循以下规则:
1 对于无符号位的数据右移时,左侧的新位一律补0
2 对于有符号位的数据右移时,左侧的新位一律补1
对于移动一位相当于整除一个2,移动2位相当于整除两个2, 依次类推

五、二进制左移运算

二进制左移运算就是把数据向左移动,右侧新增加的位添0
例:
int a=8; a<<2 =32; 二进制 8 = 00001000;移动两位 :0010 0000 ; 从上例可以看出,向左移动多少位就是 当前数乘以2的多少位次方所得到的结果。
六、按位取反运算符

按位取反就是一位一位的依次取反。
类似与 一个数同全1的数按位异或。

七、位运算项目应用

7.1 验证奇偶
能被2整除的数为偶数,反之则为奇数: 利用这一规则 我们可以验证 if(a&1){奇数}
7.2 数据互换
int swap(){
a=a^b;
a=a^a;
b=a^b;
}

相关阅读:
c一般转换规则(算术转换规则)
c概述(计算机ASCII表现形式)
逻辑标识符及逻辑表达式