- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个位掩码 k,例如 01100011。我有一个索引 j,表示我要保存的最高有效位,例如在 01100011 ==> j=2 中取 011。我想用一点操作公式找到大于 g = ((k >>(k.len-1-j))+1)<<(k.len-1-j) 的最小字典排列,其中 k.len 是位掩码的长度(示例中为 8)。
例子,
k = 01100011
for j = 2 ==> g = 10000000 because k>>(k.len-1-j) is 011
solution is 10000111
--------------------------------
k = 01100011
for j = 4 ==> g = 01101000 because k>>(k.len-1-j) is 01100
solution is 01101001
--------------------------------
k = 01100011
for j = 7 ==> g = 01100100 because k>>(k.len-1-j) is 01100011
solution is 01100101
我想知道这个公式,如果可能的话,我想知道这个公式是如何构建的。
我在 http://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation 中找到数字 k 的下一个字典顺序排列的公式,我正在寻找类似的东西。
如果只使用位运算符而不使用编译器/体系结构相关指令(我使用的是 java)会很好,但不是必需的。
最佳答案
这是一个基于此问题的答案从 C 改编为 Java 的解决方案:Calculate the smallest integer with k bits set that is greater than another integer x?
public static int smallestIntGreaterOrEqualToXwithKBitsSet(int x, int k)
{
while (Integer.bitCount(x) > k)
{
// Substitute the least-significant group of bits
// with single bit to the left of them
x |= x-1;
++x;
}
for (int i = k - Integer.bitCount(x); i != 0; --i)
{
// Set the lowest non-set bit
x |= x+1;
}
return x;
}
我通过删除 x
的第一个增量将逻辑从“大于”更改为“大于或等于”。
要使用它来解决您的问题,您可以将 g 的值作为第一个参数传递,将 k 的位数作为第二个参数传递:
public static int nextPerm(int k, int j, int len)
{
int g = ((k >>(len-1-j))+1)<<(len-1-j);
return smallestIntGreaterOrEqualToXwithKBitsSet(g, Integer.bitCount(k));
}
测试:
System.out.println(Integer.toBinaryString(nextPerm(0b01100011, 2, 8)));
System.out.println(Integer.toBinaryString(nextPerm(0b01100011, 4, 8)));
System.out.println(Integer.toBinaryString(nextPerm(0b01100011, 7, 8)));
输出:
10000111
1101001
1100101
关于algorithm - k 的下一个字典排列,约束为 'greater than or equal to number g',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37391103/
我记得从 C 天起我们就被鼓励使用 i > -1 代替 i >= 0 因为性能。 这是否仍然适用于 C# .NET 世界?在当今的编译器中使用其中一种对性能有何影响?即编译器是否足够聪明,可以为您优化
比较小于/大于比小于/大于或等于计算性能更好吗? 凭直觉,人们可能会认为小于/大于稍微好一些。 编译器可以使用一些技巧来使比较看起来相同吗? 编译器可以消除例如小于或等于与小于通过将界限增加一来实现,
所以我想知道是否有一种方法可以实现双倍大于,如下所示: if(x > y > z) { ... } 然后我看到了这个 Expression for "more than x and less than
有些人写 std::nth_element(v.begin(), v.begin()+1, v.end(), std::greater{}); 还有一些是这样写的 std::nth_element(v
这个问题在这里已经有了答案: Speed of Comparison operators (6 个答案) 关闭 5 年前。 我有点好奇这些比较操作在幕后是如何工作的,因为我正在尝试尽可能地优化我的代
此代码有效: #include #include #include #include using namespace std; int main(){ priority_queue,g
我想显示以小时、分钟和秒为单位的时间长度,其中有些时间长度大于 24 小时。目前我正在尝试这个: $timeLength = new DateTime(); $timeLength->setTime(
在我看来,它们是一样的。但在 Visual Studio 2015 中,它们肯定是不同的。 //Ok, work properly multiset > ms1; ms1.insert(10); ms
假设我有两个符号 x,y=symbols('x y') 我的目的是告诉Sympy,x总是大于y(x> y)。有什么办法可以做到这一点? 最佳答案 无法直接执行此操作。 assumptions modu
这个问题在这里已经有了答案: Javascript string/integer comparisons (9 个回答) 关闭 6 年前。 在尝试确定一个值是否大于另一个值时,我遇到了一个奇怪的 J
我正在处理一个查询,我想在其中显示即将到来的日期的数量。即使日期大于当前日期,以下查询也会返回 0。请帮我解决这个问题。 SELECT (case when b.booked_date > cast
这是我的代码 #include #include #include #include using namespace std; /* struct greater {template
我有一个包含一百万个整数的数组,因为我正在试验并行快速排序。有时我有以下奇怪的行为: 为了检查数组是否排序正确,我在排序后输入了以下代码: for(int j=0; j array_parallel
template struct greater : binary_function { bool operator() (const T& x, const T& y) const {
我在使用基本 MySQL 查询时遇到了一个令人费解的问题。 这是我的 table : id | rating 1 | 1317.17 2 | 1280.59 3 | 995.12 4 | 97
我有如下数据集: table_a Product_Name Product_Orders game_296 1 game_298
我有几个疑问,其中大部分是: select * from Blah where col > 0 和 select * from Blah where date > current_date 由于它们都
我从列 A 的第 1 行输入了数值至IA .我想创建一个循环,将一个单元格与其之前的单元格进行比较(又名单元格 B1 到 A1 或单元格 F 到 E )。让我们使用 B1和 A1作为例子。它查看单元格
我知道 std::greater 是如何工作的。但是,当我阅读自 C++14 以来 std::greater 的 API 时,它的默认类型为 void。因此,如果我们不将任何模板参数传递给更大的它默认
有没有办法通过指定“日期大于 xxxxx”过滤器来返回 OData 中的一系列记录...但使用之前从 OData 源获取的日期? 用例:假设我想要构建一个网页来显示最近完成的在线订单的列表。这就是我的
我是一名优秀的程序员,十分优秀!