1、整数转二进制数

//将一个int型整数转换为二进制数
string itob(int number)
{
	string binNum;
	while (number)
	{
		binNum += '0' + number%2;
		number /= 2;
	}
	reverse(binNum.begin(), binNum.end());
	return binNum;
}

如果需要二进制数高位补零,或者是正负数转换的二进制数有符号位,则可以对以上代码稍作处理。

2、二进制数转整数

//方法一:将一个二进制数转换为int型整数(不考虑有符号位的情况)
int btoi(string binNum)
{
	int ret = 0;
	for (auto x : binNum)
		ret = ret * 2 + (x - '0');
	return ret;
}

当然你也可以从二进制的低位开始算起(就像教科书里将一个二进制数化为整数那样),如下

//方法二:将一个二进制数转换为int型整数(不考虑有符号位的情况)
int btoi(string binNum)
{
	int ret = 0;
	for (int i = binNum.size() - 1; i >= 0; i--)
		ret += (binNum[i] - '0') * pow(2, binNum.size() - i - 1);
	return ret;
}

两种方法都可以实现目的,但是在对二进制求模的时候会稍有区别,继续往下面看。

3、二进制求模

现在有个问题:有两个二进制字符串binStr1、binStr2,要求你用binStr1对binStr2求模,结果还是用二进制字符串形式返回,你会怎么做?

当然,最容易想到的也最简单的方式,就是利用我们上面写的btoi和itob函数,现将这两个二进制字符串转换为整数,然后整数用%求余,结果再用itob函数转换为二进制字符串返回,完美!

那你真的是很聪明了!我现在加大难度,假如说binStr1这个二进制串非常非常长,表示的整数远远超过了int甚至是long long类型所能表示的范围;也就是说这个整数计算机它存储不了!(当然binStr2表示的范围没有那么变态,因为对binStr2求模的结果可能需要用计算机表示出来)。那这个时候我还让你求出这个模的结果(求模的结果用二进制串或者整数类型表示都可以),你会怎么办?

我们先来看一下二进制求模的时候是什么样子的吧。假如我们需要求10011110(158) 对1010(10)的模:

int转换string java int转换成二进制_int转换string java

余数1000(8)即所求的结果。

其实我们演示的这个二进制除法过程跟十进制除法是一样的。当然我们受此启发,如果按照这个过程对binStr1和binStr2进行处理,求他们模的结果,应该说也不是不可以,只是这样会特别麻烦。

如果我们对这个过程继续深入探究的话,我们将会发现一些端倪!!

看除法的过程是怎么做的??对于被除数二进制串,不停的往后走,直到找到一个大于等于除数二进制串的数,第一次找到的是10011,对除数1010作除法得到余数1001,然后拿到被除数的下一位组成10011,继续对除数1010作除法,得到余数1001,然后继续往下面进行..........

如果我们不用处理二进制字符串的方法进行求余数,而是在这个过程中用整数求余的方式进行,不是也完美避免了因为二进制数过大而导致的计算机不能表示带来的死结嘛?

直接上代码,给出一个直观的理解:求一个二进制串表示的大整数对另一个整数求模的结果,结果用十进制整数返回

/**
  function:求一个二进制串表示的大整数对另一个整数求模的结果,结果用十进制整数返回
  假设:二进制串表示的大整数是bigBinNum,对mod求模。
  **/
#define MOD mod
int binaryMod(string bigBinNum)
{
	int ret = 0;
	for (auto x : bigBinNum)
		ret = (ret * 2 + x - '0') % MOD;
	return ret;
}

这里的代码流程跟上面二进制转整数方法一里面的方法是一样的,只是稍稍多加了一个求模的功能。

在刷LeetCode的时候遇到这个小问题(求一个二进制串表示的大整数对另一个整数求模的结果,结果用十进制整数返回),在此稍作总结,以便以后可以随时复习查看。