用位运算解决人员派遣问题或者类似可以用0和1表示结果(即结果只有2种)的种类问题。
每个人只有去或不去2个结果,5个人最多有2^5种,用5个数字表示A--D去或不去,0表示不去,1表示去,如10001,即A和D要去,对此不难联想到2进制。于是可以做0到31的一个循环,(n&16)>>4就是A的结果,用&16保留第5位的结果,其他置0,以此类推。
另外,我们知道某一位&1,|0,^0,结果不变,所以对某一位置0而且其他位不变,可以让某个数n,在某一位&0,其他位&1,tag表示具体置0的位,即n&=~(1<<tag),类比可得,某一位置1:n|=1<<tag,
某一位取反:n^=1<<tag。
宏的使用可以简单理解为单纯的文本替换,切记宏不是c语言的语句,所以语句不是必须用分号结尾,如果用分号结尾,那分号也会随着宏的替换而替换。
而且使用带参数的宏,一定要加括号,如#define cube ((x)*(x)*(x))如果不加括号#define cube x*x*x
我希望结果是1
结果是625,因为宏做的是文本替换,如果不加括号就会变成125/5*5*5,结果自然与我们希望的相差甚远。