- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
随机(但重复)置换 Java 字节数组中所有位的最快方法是什么?我试过用 BitSet 成功地做到了,但是有更快的方法吗?显然,for 循环消耗了大部分 CPU 时间。
我刚刚在我的 IDE 中做了一些分析,for 循环占整个 permute() 方法中 64% 的 cpu 时间。
澄清一下,数组 (preRound) 包含进入过程的现有数字数组。我希望该数组的各个设置位以随机方式混合在一起。这就是 P[] 的原因。它包含一个随机的位位置列表。因此,例如,如果设置了 preRound 的第 13 位,它会被转移到 postRound 的 P[13] 位置。这可能在 postRound 的位置 20555。整个事情是置换网络的一部分,我正在寻找置换传入位的最快方法。
到目前为止我的代码...
private byte[] permute(byte[] preRound) {
BitSet beforeBits = BitSet.valueOf(preRound);
BitSet afterBits = new BitSet(blockSize * 8);
for (int i = 0; i < blockSize * 8; i++) {
assert i != P[i];
if (beforeBits.get(i)) {
afterBits.set(P[i]);
}
}
byte[] postRound = afterBits.toByteArray();
postRound = Arrays.copyOf(postRound, blockSize); // Pad with 0s to the specified length
assert postRound.length == blockSize;
return postRound;
}
仅供引用,blockSize 约为 60,000,P 是一个随机查找表。
最佳答案
我没有执行任何性能测试,但您可能需要考虑以下内容:要省略对 Arrays.copyOf 的调用(它会复制内部使用的 long[] 的副本,这有点烦人),只需设置最后一位以防之前未设置它,然后再将其取消设置。
此外,有一个很好的惯用法来迭代输入排列中的设置位。
private byte[] permute(final byte[] preRound) {
final BitSet beforeBits = BitSet.valueOf(preRound);
final BitSet afterBits = new BitSet(blockSize*8);
for (int i = beforeBits.nextSetBit(0); i >= 0; i =
beforeBits.nextSetBit(i + 1)) {
final int to = P[i];
assert i != to;
afterBits.set(to);
}
final int lastIndex = blockSize*8-1;
if (afterBits.get(lastIndex)) {
return afterBits.toByteArray();
}
afterBits.set(lastIndex);
final byte[] postRound = afterBits.toByteArray();
postRound[blockSize - 1] &= 0x7F;
return postRound;
}
如果这还不行,万一你使用相同的 P 进行多次迭代,可能值得考虑将排列转换为循环表示法并就地执行转换。通过这种方式,您可以线性迭代 P,这可能使您能够更好地利用缓存(P 是字节数组的 32 倍,假设它是一个 int 数组)。然而,您将失去只需查看 1 并最终移动字节数组中的每一位(无论是否设置)的优势。
如果你想避免使用 BitSet,你可以手动完成:
private byte[] permute(final byte[] preRound) {
final byte[] result = new byte[blockSize];
for (int i = 0; i < blockSize; i++) {
final byte b = preRound[i];
// if 1s are sparse, you may want to use this:
// if ((byte) 0 == b) continue;
for (int j = 0; j < 8; ++j) {
if (0 != (b & (1 << j))) {
final int loc = P[i * 8 + j];
result[loc / 8] |= (1 << (loc % 8));
}
}
}
return result;
}
关于java - 置换 Java 数组中位的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810904/
我正在尝试获取 vector 的每个排列,但也有一个指示子排列的分隔符。从我的结果中可以看出,我的代码似乎有一个错误,即结束排列。 0 1 3 2 | 和 0 2 3 1 | 和 0 3 2 1 |
假设我有整数数组列表...有没有一种方法可以生成数组列表中元素的随机排列/排列 所以如果列表是 {1,2,3,4,5,6} 调用一些方法 randomPermute() 会把它变成随机的东西,比如 {
为什么此代码注释有效(代码编译并运行良好,但实际上并未显示排列): int main(int argc, char *argv[]) { long number; vector int
我正在开发一个模块化 Maven 项目。我的项目的框架如下: |-- parent |-- model --pom.xml |-- services -
随机(但重复)置换 Java 字节数组中所有位的最快方法是什么?我试过用 BitSet 成功地做到了,但是有更快的方法吗?显然,for 循环消耗了大部分 CPU 时间。 我刚刚在我的 IDE 中做了一
假设我有一个 int T 数组,我正在寻找一种置换 i 和 T[i] 的就地算法 我有:[3 2 0 1] (a) 我想要:[2 3 1 0] (b) 例如。在 (b) 中 T[0] = 2 因为在
我有以下问题: 在 __m128i寄存器有 16 个 8 位值,按以下顺序排列: [ 1, 5, 9, 13 ] [ 2, 6, 10, 14] [3, 7, 11, 15] [4, 8, 12,
是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信此类功能在第二代/第三代着色器中可用,但我不知 Prop 体的配置文件是什么,也不知道如何使用。 最佳答案 不,这是不可能的。 您可以在片
是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信此类功能在第二代/第三代着色器中可用,但我不知 Prop 体的配置文件是什么,也不知道如何使用。 最佳答案 不,这是不可能的。 您可以在片
我有一个 arma::cube mycube(5,10,15); 我想排列它的尺寸,就像在 matlab 中做的那样: mycube = ones(5,10,15); mycube = permute
假设 100 人围成一圈。从第 1 人数到第 14 人,将此人移出圈子。按照数数顺序,再次数数,去掉第 14 个人。重复。最后站着的是谁? 我已经尝试了一切来解决这个问题,但它似乎无法处理死循环。
我对使用 C 代码置换 d 维张量的元素很感兴趣(因此,只使用循环),我想用 d 作为参数编写函数。张量数据目前包含在“d 维”指针中(例如,当 d = 1 时的简单数组)。到目前为止,我已经用 **
我正在尝试为网站上的图像创建 rgb 偏移效果。我有基本的功能,但问题是 channel 被纹理的 uv 偏移了。因此,如果图像大小不同,则每个图像的偏移量在视觉上并不相同。 这是我的片段着色器。 u
我正在开发一个由 SQLite 数据库支持的 C++ 程序。该数据库包含文档表、文档元素和文档边界(即位于文档边界上的文档元素集)。文档是在运行时创建的。 该程序支持合并文档的基本操作,它使用源文档中
假设您有一个 std::vector某种类型的T和一系列指数 std::vector这个 vector 。现在我正在寻找一个函数 permute(const std::vector& vector,
我正在尝试用 替换我的表结构标签。但是前导订单号和内容之间总是存在位移/偏移。 A Name An Icon 我不知道要更改什么。当我使用
这个问题与这个question有关可能到this other 假设您有两个矩阵 A 和 B。A 是 M×N,B 是 N×K。我想获得一个 M×K 矩阵 C 使得 C(i, j) = 1 - prod(
我是一名优秀的程序员,十分优秀!