目录
学习目标:
使用二进制方法解决如下题目
N 皇后问题
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/n-queens/solution/nhuang-hou-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
学习内容:
位运算符号
符号 | 解释 | 示例 |
---|---|---|
~ | 数按位取反,0变为1,1变为0 | ~1=0;~0=1 |
& | 全为1,结果才为1 | 0&0=0;0&1=0;1&0=0;1&1=1; |
| | 只要有一个为1,结果就为1 | 0|0=0;0|1=1;1|0=1;1|1=1 |
^ | 两个值不同,则该位结果为1,否则为0 | 0^0=0;0^1=1;1^0=1;1^1=0; |
>> | 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃 | 101>>1=110;011>>1=001 |
>>> | 各个位向右移指定的位数。右移后左边空出的位用0来填充,移出右边的位被丢弃 | 101>>>1=010;011>>1=001 |
<< | 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0) | 2<<1=4; |
位运算技巧
运算 | 目标 |
---|---|
x&(-x) | 获取二进制中最后一个1 |
x&(x-1) | 去除二进制中最后一个1 |
(n & 1) == 1 | 判断奇偶,奇数位1偶数位0 |
原码、反码,补码
看了些文章,大概描述反码,补码出现的原因是由于运算器,只有加法运算器,计算机中的没法直接做减法的。原码、反码、补码的产生过程就是为了解决计算机做减法和引入符号位的问题。
符号位:任何存储于计算机中的数据,其本质都是以二进制码存储。如使用符号位,则使用最高位代表符号位,如果该位为0,则说明该数为正;若为1,则说明该数为负。
参考资料如下:
二进制的原码、反码、补码 - 知乎
百度安全验证
补码_百度百科
原码:
是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值。
符号位引起的问题:
0001+0010=0011,1+2=3;
0000+1000=1000,+0+(-0)=-0;
0001+1001=1010,1+(-1)=-2。
反码:
反码计算方式:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。
符号位引起问题:
0001+1110=1111,1+(-1)=-0;
1110+1100=1010,(-1)+(-3)=-5。
补码:
补码计算方式:正数的补码等于它的原码;负数的补码等于反码+1。
补码的思想:
在介绍补码概念之前,先介绍一下“模”的概念:“模”是指一个计量系统的计数范围,如时钟。计算机也可以看成一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的,因此它也有一个计量范围,即都存在一个“模”。如:时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2^n-1
,模=2^n.“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算 。
假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6。在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。对“模”而言,2和10互为补数。实际上,以12为模的系统中,11和1,8和4,9和3,7和5,6和6都有这个特性,共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丢失。又回到了 00000000,所以8位二进制系统的模为2^8。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。
由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,因此计算机中均采用补码进行加减运算。
故在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理
为什么负数的补码的求法是反码+1
因为负数的反码加上这个负数的绝对值正好等于11111111,在加1,就是100000000,也就是八位二进数的模。可以通过模减去负数的绝对值得到它的补码,所以负数的补码就是它的反码+1。