我的程序在翻转位时崩溃

My program is crashing when flipping bits

本文关键字:崩溃 翻转 程序 我的      更新时间:2023-10-16

我有这个函数,显然它会导致我的程序崩溃:

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

看起来你的dp()函数递归得很深。 考虑到对dp(3)的调用可以与您的^一起按顺序评估所有 65536 个可能的位板,而对于您的&~,对 dp(k) 的调用将仅在k之前以数字方式评估位板。 请注意,您正在按顺序填写mat main() ;如果你在k之前只在数字上依赖于位板,你不会非常深入地递归。

编辑:至于解决这个问题,你可能会认为动态规划是有向无环图中最短的路径。 问题是你这里没有一个无环图。 您正在执行深度优先搜索以在此处查找最短路径,这不会...工作。 尝试用广度优先搜索或Dijkstra算法替换它。

我的猜测是这一行崩溃了:

cout <<mat[bs.to_ulong()] <<endl;

由于 BS 大于 1<<16 的保留空间

附言:为什么对所有内容都使用long long 数据类型?long long 是 64 位。你做的大多数事情都可能用一个简短的int来完成