r ^ cur,记录变化的位数(例如一位就是0001,两位就是0011),移除”01”变为”10”的2次。”10”后面就是变化次数-2。xxxxxx(10)0001
Code
1 2 3 4 5 6 7 8 9 10 11 12 13
std::vector<int> GospersHack(int m, int n){ std::vector<int> ans; int set = (1 << m) - 1; int limit = (1 << n); while (set < limit) { ans.push_back(next_status(set)); int lowbit = set & -set; int r = set + lowbit; set = (((r ^ set) >> 2) / lowbit) | r; // set = next_status(set); } return ans; }
1 2 3 4 5 6
intnext_status(int cur){ int lowbit = cur & -cur; int r = cur + lowbit; return (((r ^ cur) >> 2) / lowbit) | r; // return ((r ^ cur) >> __builtin_ctz(lowbit) + 2) | r; }
1 2 3 4 5 6 7 8 9
defnext_status(cur: int): lowbit = cur & -cur r = cur + lowbit return (((r ^ cur) >> 2) // lowbit) | r ''' def count_trailing_zeros(x): return (x & -x).bit_length() - 1 return ((r ^ cur) >> count_trailing_zeros(lowbit) + 2) | r '''