关于n皇后问题位运算版的思考

本文通过C语言实现八皇后问题,详细解析了位运算的高级应用技巧,包括如何利用位运算进行高效的搜索和判断,以及如何通过按位与操作筛选有效位置。

看了Matrix67神牛的位运算简介及实用技巧(三):进阶篇(2),下面是我写的C语言代码和我的思考作补充:

 1 //By LYLtim
 2 
 3 #include<stdio.h>
 4 
 5 const unsigned upperlim = (1 << 8) - 1;
 6 unsigned ans = 0;
 7     
 8 void DFS(unsigned row, unsigned ld, unsigned rd)
 9 {
10     if (row != upperlim) {
11         unsigned pos = upperlim & ~(row | ld | rd), p;
12         while (pos) {
13             p = pos & -pos;
14             pos -= p;
15             DFS(row | p, (ld | p) << 1, (rd | p) >> 1);
16         }
17     } else ans += 1;
18 }
19 
20 int main(void)
21 {
22     DFS(0, 0, 0);
23     printf("%d\n", ans);
24 }

 

  • -a=~a+1

位运算简介及实用技巧(一):基础篇整数类型的储存

这里我画个表格简单表示一下

0X0000……0X7FFFF0X8000……0XFFFF
0……32767-32768……-1
  • pos & (~pos + 1) 是取出最右边的那个1

pos & ~pos 所有位全0,+1改变最低位:

(i)最低位为0:~0=1,1+1=10,前位进1,0&0=0,此位为0不变;

(ii)最低位为1:~1=0,0+1=1,其他位全为0不变,1&1=1,此位为1;

  • &upperlim

这个我看时最难理解,任何位&1都是它本身,这有何作用?

后来明白了,作用就是从最低位起取n个数为有效位置,因为在上一次的运算中ld发生了左移,如果不and的话,就会误把n位左边的位当做有效位,n位左边有1就会发生错误。

转载于:https://www.cnblogs.com/LYLtim/archive/2012/04/30/2476882.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值