翻转位时我的程序崩溃了

时间:2012-11-27 12:38:53

标签: c++ bits bitmask

我有这个功能,显然它会导致程序崩溃:

long long todos(long long x,long long i) {
  x ^= (1 << i);
  long long aux = i - 1;
  if(aux >= 0) x ^= (1 << aux);
  aux = i - 4;
  if(aux >= 0) x ^= (1 << aux);
  aux = i + 1;
  if(aux < 16) x ^= (1 << aux);
  aux = i + 4;
  if(aux < 16) x ^= (1 << aux);
  return x;
}

我不明白为什么当我为^= (更改所有&= ~(时,它运行得非常好(尽管我得到的输出不同)。这种行为有合理的解释吗?

如果您需要整个代码:http://ideone.com/Z7qoof

2 个答案:

答案 0 :(得分:1)

看起来您的dp()功能非常深入。考虑到dp(3)的调用可以使用^按顺序评估所有65536个可能的位板,而&~调用dp(k)只能在k之前以数字方式评估位板1}}。请注意,您正在mat按顺序填写main();如果你只是在k之前以数字方式依赖于位板,那么你就不会非常深刻地进行递归。

编辑:至于修复此问题,您可能会认为动态编程是有向无环图中的最短路径。麻烦的是你这里没有非循环图。你正在进行深度优先搜索,以便在这里找到最短的路径,这不会起作用。尝试用广度优先搜索或Dijkstra算法替换它。

答案 1 :(得分:0)

我的猜测是这条线崩溃了:

cout&lt;&lt; mat [bs.to_ulong()]&lt;&lt; ENDL;

由于bs大于1 <&lt; 16

的保留空间

P.S。为什么要使用long long数据类型?长多是64位。你做的大多数事情都可能用短的int

完成