进制转换与位运算的运用

 

目录

一、位运算

二、数制(进制)介绍

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)
00000000
10001011
20010022
30011033
40100044
50101055
60110066
70111077
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F

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

 

三、进制转换

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

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

例1:

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

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

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

例2:

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

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

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

例3:

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

2、相关代码与结果演示

(1)相关代码

#include<stdio.h>

void 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
000
010
100
111

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

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

(2)、位或(|)

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

操作数a操作数b结果c
000
011
101
111

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

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

(3)、异或(^)

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

操作数a操作数b结果c
000
011
101
110

 简记:相同为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;
}

结果演示:

 六、总结

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

  • 45
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
C语言是一种十分常用的编程语言,它也支持将十进制数转换成二进制数。在C语言中,实现这一功能的方法一般有以下几种: 1. 通过位运算符实现:在C语言中,位运算符具有处理二进制数的特性,因此我们可以使用位运算符来进行十进制数向二进制的转换。具体的实现方式是通过移位运算将十进制数的各个二进制位一一取出,然后再通过按位与运算来获取对应位的二进制值。例如: unsigned int decToBin(int decimal) { unsigned int binary = 0; int weight = 1; while (decimal) { binary += (decimal % 2) * weight; decimal /= 2; weight *=10; } return binary; } 2. 使用递归实现:递归是指函数内部调用自身来达到某种目的的一种编程技巧。将十进制数转换为二进制数的过程可以通过递归实现。具体实现方法是将十进制数不断除以2,将余数保存下来,直到商为0,然后将余数按照逆序排列即可得到对应的二进制数。 char *decToBin(int decimal) { static char binary[33]; if (decimal == 0) { return "0"; } else if (decimal == 1) { return "1"; } else { sprintf(binary, "%s", decToBin(decimal/2)); if (decimal % 2 == 0) { strcat(binary, "0"); } else { strcat(binary, "1"); } return binary; } } 通过以上两种方法的实现,我们就可以将十进制数转换为二进制数了。在C语言编程过程中,熟练掌握这些方法是非常重要的,因为它们常常会在实际的开发中被广泛地运用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯择微韵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值