http://blog.csdn.net/caroline_wendy/article/details/20149075
输出一些互斥的组合, 可以抽象为:
即:
1, 4, 7 除 3 余 1;
2, 5, 8 除 3 余 2;
3, 6, 9 除 3 余 0;
除3余数(%3)不相等即可;
使用一个字节存储变量是关键, 则需要对2进制数进行操作, unsigned char是占用一个字节;
- void Chess (void) {
- for (i.a=0; i.a<9; ++i.a)
- for (i.b=0; i.b<9; ++i.b)
- if (i.a%3 != i.b%3)
- printf ("A=%d, B=%d \n", i.a+1, i.b+1);
- }
可以利用移位运算, 进行求解, 81=10000(3进制), 后两位为一个数字, 前两位为一个数字,
除法(/)就是移位运算, 除以9就是移两位, 再进行比较余数(%);
- void Chess2 (void) {
- unsigned char i = 81;
- while (i--) {
- if ((i/9%3) == (i%9%3))
- continue;
- printf ("A=%d, B=%d \n", i/9+1, i%9+1);
- }
- }
3 void main() 4 { 5 short unsigned int x; 6 7 for (x = 0; (x & 0xF0) < 0x90; x += 0x10 ) { 8 for ( x &= 0xF0; (x & 0x0F) < 9; x++) 9 if ((x >> 4) % 3 != (x & 0x0F) % 3) 10 printf("A = %d, B = %d\n", (x >> 4) + 1, (x & 0x0F) + 1); 11 } 12 }http://www.cnblogs.com/jiayith/p/3500497.html
struct myBits { unsigned char a:4; //4位可以表示0-15的值了 unsigned char b:4; }; int main(void) { myBits my; for (my.a=0;my.a<=8;my.a++) { for (my.b=0;my.b<=8;my.b++) { if (my.a%3!=my.b%3) { cout<<"("<<(int)my.a<<","<<(int)my.b<<")"<<endl; } } } cin.get(); return 0; }用一个char,我的机器八位,左4位表示将的位置,右位表示帅的位置,关键是怎么给一个8位的char的左右半边赋值再获得左右半边的值.位操作!
#define FULLMASK 255 // 11111111 #define RMASK (FULLMASK>>4) //00001111 #define LMASK (FULLMASK<<4) //11110000 /*下面是几个获得左右半边值的宏*/ #define GETR(t) (t&RMASK) //获得右半边4位的值,用掩码,掩盖住左半边的值,注意这个位操作不改变原有值 #define GETL(t) ((t&LMASK)>>4) //获得左半边4位的值,先掩盖右4位,再把值右移4位,注意这里要价格括号...我猜临时值放在某寄存器里 /*下面是设置左右半边值的宏*/ #define SETR(t,val) (t=(t&LMASK)|val)//((t=t&LMASK),(t=t|val)) //用十进制val设置右4位,但要保证val可以用4位表示,即val表示值的位在低4位.(这里先清空右四位,再与左4位全是0而右4位是值的val或) #define SETL(t,val) (t=((t&RMASK)|(val<<4)))//((t=t&RMASK),(t=t|(val<<4))) //用十进制val设置左4位 (先清空左4位,再把val右边4位的值移动到左边,再与) int main(void) { using namespace std; unsigned char my; //注意这里一定要用无符号的,要不放最高位为1就麻烦了.... for (SETL(my,0);(int)GETL(my)<=8;SETL(my,(int)GETL(my)+1)) { for (SETR(my,0);(int)GETR(my)<=8;SETR(my,(int)GETR(my)+1)) { if (((int)GETL(my)%3)!=((int)GETR(my)%3)) { cout<<"("<<(int)GETL(my)<<","<<(int)GETR(my)<<")\n"; } } } cin.get(); return 0; }