首先,nand可以表示出所有逻辑运算
not a=a nand a
a and b=not(a nand b)
……
这是离散数学里的一个性质,忘了叫啥了……
既然nand可以表示出所有逻辑运算,将相当于能够对n个数,随意组合然后进行任意一种逻辑运算,这样就能表达出大部分
的数,但是有些数还是不能弄出来。
例如对与15(1111),8(1000),7(0111),1(0001),这四个数来说,在二进制位中,第二位和第三位在四个数中都是相同
的,那么我们对其进行任意的逻辑运算后的结果的第二位和第三位也一定相同。那么x01x,x10x,这种有8个数就不能弄
出来。
所以我们就可以对每一个二进制位,求出n个数中都与它相同的位置,作为一个基底。
最后统计个数时,将基向量从小到大‘或’起来,并判断是否大于指定值,若不大于,且当前基向量的二进制中0的个数为
r,则能产生的数的个数就为2^r。