一、二进制规则
1. 逢二进一
一位数字中只有0和1两种可能。
2. 尾数为0是偶数(even);尾数为1是奇数(odd)
大于一位二进制数减去其末位上的数字后必然是2的乘方或2的乘方和,可以被2整除,所以必然是一个偶数。加上末位上的数字后,若末位数字是1,则该数为偶数加1为偶数加1,为奇数;若末位数字是0,则结果不变,为偶数。
我觉得类似于十进制中,大于一位的十进制数减去其末位上的数后为10的乘方或10的乘方和。因此,若末位数字为0,则该数能被10整除(是10的整数倍);反之,若末位数字非0,则不能被10整除。
3. 任意一个二进制数尾部添一个0,结果等于原数乘二
二进制数额外添加一个末位数字0,我觉得相当于其每一个数位上的数值不变但都往左移了一位,所以每一位所表示的数值都是之前的两倍,最后整个二进制数也变为原来的两倍。
类似于十进制中,任意十进制数字额外在末位添加一个0,结果等于原数乘十(相当于每一位数所表示的数值都是原来的十倍)。
4. 任意一个二进制数 100…0(i个0) = 2i(2的i次幂); 11…1(i个1) = 100…0(i个0) - 1 = 2i - 1
另:210 = 1024
二、课堂练习
1) 1 + 2 + 22 + 23 + … + 210
法一:等比数列求和公式
法二:原式 = 1(2) + 10(2) + 100(2) + 1000(3) + … + 100…0(10个0) = 111…1(10个1) = 100…0(11个0) - 1 = 211 - 1 = 2048 - 1 = 2047
2) 十进制转二进制
假设一个十进制数为D
第一步:可以知道D如果表达为二进制最后一个比特的数值(偶数是0,否则为1)
第二部:处理剩下的数位,去掉最后一个比特(右移一位,相当于D整除2),然后重复第一步(递归调用)
// 以下是使用c++的实现,其中我用字符串来表示目标二进制数,只能处理0和正整数
string Dec2Bin(int d) // 需要使用到string类
{
string b{
};
if (d <=1) {
// 递归调用结束条件
if (d) {
return "1";
} else {
// 处理d原本为0的情况
return "0";
}
}
b = Dec2Bin(d >> 1); // 记录d向右移一位(除以二)后作为参数递归调用函数的返回值
if (d % 2) {
// 将此次递归调用的结果(0或1)连接到字符串末位
return b + "1";
} else {
return b + "0";
}
return b;
}
另记(位操作):
~:按位取反
&:按位与,同时为一结果才是1,否则结果为0
^:按位异或,不同为1,相同为0
|:只要有至少一个1结果就是1,否则结果为0
3) 不使用"+"实现整数加法
// c/c++函数实现
int myAdd(int a, int b)
{
if