ken*_*ytm 17 language-agnostic algorithm bit-manipulation
我最近在D新闻组上读了一个有趣的帖子,基本上要求,
给定两个(签署)整数一个 ∈[ 一分钟,一最大值 ],b ∈[ b 分钟,b 最大值 ],什么是最紧密的间隔一个 | b?
我认为如果区间算术可以应用于一般的位运算符(假设无限位).按位NOT和移位是微不足道的,因为它们只对应于-1- x和2 n x.但由于按位和算术属性的混合,按位-AND/OR更加棘手.
是否有多项式时间算法来计算按位AND/OR的间隔?
注意:
~(a | b) = ~a & ~b
,解决按位AND和-NOT问题意味着按位OR完成.[2, 3] | [8, 9] = [10, 11]
.)对于非负整数的区间 [a min , a max ],我们可以计算按位最小值 a 0,其中只要区间内可能,位就会独立设置为 0。类似地,我们可以计算按位最大值 a 1,其中在区间内尽可能多的位被设置为 1。对于 [b min , b max ],我们执行相同的操作并得到 b 0和 b 1。那么结果区间就是[a 0 | 0 , 1 | b 1 ]。
很容易从 [a min , a max ]中检查 a 可以采用哪些值。对于位 n,如果 m >= n 的所有位 m 在最小值和最大值中一致,则该值被强制,否则它可以是 0 或 1。
这可以在 O(n) 内完成。
签名的案例留给读者作为练习。第一步是提供按位运算符对负整数的含义的定义。
编辑:不幸的是,这是错误的:考虑 [a min , a max ] = [b min , b max ] = [1,2]的情况。那么a | b
可以是 1、2 或 3,但按位最小值为 0。