> 文档中心 > 进制转换与位运算的运用

进制转换与位运算的运用

 

目录

一、位运算

二、数制(进制)介绍

1.数值

三、进制转换

1.各种进制转换成十进制

2.十进制转换为其它进制

3、十进制转化为其它进制

4、二进制、八进制和十六进制的关系

四、计算机中比特bit,字,字节的关系

1.比特bit

2.字节

3.字

五、位运算介绍

1、位运算的分类

2、逻辑位运算

(1)、位与(&)

(2)、位或(|)

(3)、异或(^)

(4)、按位取反

3、移位位运算

4、实例讲解

 六、总结


一、位运算

 由于所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。

二、数制(进制)介绍

1.数值

所谓数制,是指多位数码中每一位的构成方法以及从低位到高位的进位规则。

常见的数制有二进制(B)、八进制(O)、十进制(D)和十六进制(H)。

表1  不同进制数的对照表

十进制(D) 二进制(B) 八进制(O) 十六进制(H)
0 0000 00 0
1 0001 01 1
2 0010 02 2
3 0011 03 3
4 0100 04 4
5 0101 05 5
6 0110 06 6
7 0111 07 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

注:对于上述进制表格中数值转换应当牢记。

 

三、进制转换

1.各种进制转换成十进制

规则:“按位加权求和”,其数学表达式为:

例1:

2.十进制转换为其它进制

1、以十进制转换成二进制为例:

(1)整数部分的转换:(规则:除基取余,逆序排序)

例2:

证明:假定十进制整数为,其等值是二进制数为,则可知:

 有上述可知十进制整数每次除于2,都可得到一个余数,即得到二进制整数的每一位,且最后得到的是最高位。

(2)小数部分的转换(规则:乘基取整,顺序排列)

例3:

 其证明如上述整数的证明相似。

2、相关代码与结果演示

(1)相关代码

#includevoid ToTen(){int r,R;//r为输入是数字,R为进制数printf("请输入你要转换的数字: ");scanf("%d:",&r);printf("请输入你要转换的进制数: ");//scanf("请输入你要转换的数字%d: ",&r);scanf("%d",&R);int a=0,i=1;while(r!=0){a=a+(r%10)*i;r=r/10;i=i*R;}printf("输出的十进制数为:%d",a);printf("\n");}void TenTo(){int S,R;printf("请输入一个十进制数: ");scanf("%d",&S);printf("要转换的进制数:");scanf("%d",&R);int a[1000];int i=0;while(S>0){a[i++]=S%R;S=S/R;}for(int j=i-1;j>=0;j--)   //逆序输出{printf("%d",a[j]);}printf("\n");}void caidan(){printf("\n");printf("    \n");printf("  进制转换 \n");printf("    1、任意进制转换为十进制     \n");printf("    2、十进制转换为任意进制     \n");printf("    \n");printf("\n");}int main(){int n=0;while(1){caidan();printf("请选择你要转换的方式: ");scanf("%d",&n);switch(n){case 1 :ToTen();break;case 2 :TenTo();break;default:printf("你的选择错误!\n");break;}}}

(2)结果演示

3、十进制转化为其它进制

将十进制换为R进制的方法:整数部分采用基数(R)除法,即除基(R)取余,逆序排列;小数部分采用基数(R)乘法,即乘基(R)取整,顺序排列。

4、二进制、八进制和十六进制的关系

(1)将二进制数从小数点开始分别向右和向左分成三位一组,每组组成一位八进制;若不能正常构成三位一组,则在二进制整数部分高位添零或在小数点低位添零来补足三位一组。反之八进制数按位展成三位二进制数即可。

(2)将二进制数从小数点开始分别向右和向左分成四位一组,每组组成一位十六进制;若不能正常构成四位一组,则在二进制整数部分高位添零或在小数点低位添零来补足四位一组。反之八进制数按位展成四位二进制数即可。

四、计算机中比特bit,字,字节的关系

在用位运算的方法解答问题时,我们必须了解计算机是多少位的系统,防止溢出等问题

1.比特bit

比特bit,即二进制位(Binary digit)一个二进制包含的信息量称为一个比特bit,二进制只有0和1。比特bit是计算机内部数据存储的最小单位。

2.字节

字节Byte是计算机数据处理的最小单位,一个字节有8个比特bit组成,即1字节=8bit。

3.字

字是有若干字节组成,字的位数叫作字长,同时字也是计算机一次处理数据的最大单位。

字和字节的关系:

(1)32位计算机:1字=32位=4字节=32bit

(2)64位计算机:1字=64位=8字节=64bit

五、位运算介绍

1、位运算的分类

位运算分为 逻辑(布尔)位运算符 和 移位位运算符。
  逻辑位运算符又分为 位与(&)、位或(|)、异或(^)、按位取反(~);移位位运算符分为 左移(<>)。下面对其进行详细介绍

2、逻辑位运算

(1)、位与(&)

位与(&),c=a&b,按位进行运算,共有四种情况

操作数a 操作数b 结果c
0 0 0
0 1 0
1 0 0
1 1 1

 简记:两者都为1,结果才为1,其余为0。

注:负数按补码形式进行按位与运算。

(2)、位或(|)

位或(|),c=a|b,共有四种情况

操作数a 操作数b 结果c
0 0 0
0 1 1
1 0 1
1 1 1

 简记:有一个为1,结果就为1,两者都是0,才为0

注:负数按补码形式进行按位或运算。

(3)、异或(^)

异或(^),c=a^b,共有四种情况

操作数a 操作数b 结果c
0 0 0
0 1 1
1 0 1
1 1 0

 简记:相同为0,不同为1。

异或的基本性质

性质 数学表达式
交换律 a^b=b^a
结合律 a^(b^c)=(a^b)^c
———— a^0=a;a^a=0
自反性 a^b^b=a^0=a

(4)、按位取反

对于操作数1010,取反为0101。简记:0变1,1变0.

3、移位位运算

符号 含义 实例
>> 右移 a>>b
<< 左移 b<<a

注:(1)左移,将各二进位全部左移若干位,高位丢弃,低位补0。

(2)右移,将各二进位全部右移若干位,对无符号数,高位补0,

4、实例讲解

(1)、汉明距离(来源:461. 汉明距离 - 力扣(LeetCode) (leetcode-cn.com))

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

代码部分

int hanmingDistance(int x,int y){int n=x^y;    int count=0;while(n){n=n&(n-1);++count;}return count;}

结果演示:

(2)前n个数字二进制中1的个数(来源:剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 - 力扣(LeetCode) (leetcode-cn.com))

给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。

 

 代码部分:

/ * Note: The returned array must be malloced, assume caller calls free(). */ int countOnes(int x) {    int count = 0;    while (x > 0) { x &= (x - 1); count++;    }    return count;}int* countBits(int n, int* returnSize) {    int* res = malloc(sizeof(int) * (n + 1));    *returnSize = n + 1;    for (int i = 0; i <= n; i++) { res[i] = countOnes(i);    }    return res;}

结果演示:

 六、总结

在运用位运算时,需要时刻注意计算机系统的位数,数据类型大小,同时要对数值有一定是了解,在用位运算解题时,才能提高效率。