- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我突然想到一定有一种聪明的方法可以做到这一点。这不是为了家庭作业,或工作或任何东西。我只是在研究一种数据交错的文件格式。
因此,在通用 C/C++ 中,(或其他)给定一些数组
int x[] = ...
有没有巧妙的方法将它分成两个短数组
short sa1[], sa2[]
使得 int 数组从中间 split
x[i] = 1111111111111111 1111111111111111
sa1[i] sa2[i]
编辑:抱歉,如果措辞不当。对于 int 数组的每个第 i 个元素,最左边的 16 位成为一个数组的第 i 个元素,最右边的 16 位成为第二个数组的第 i 个元素。
如此给定
x[i] = 0001111111111111 1111111100011111
然后
sa1[i] = 0001111111111111
sa2[i] = 1111111100011111
我正在寻找不在每个元素上循环并移动和屏蔽每个元素的非显而易见的答案。这很容易:)
最佳答案
有很多方法可以做到这一点:
假设:
short
是 16 位。int
是 32 位。方法一:(一个简单的循环)
for (int i = 0; i < size; i++){
int tmp = x[i];
sa1[i] = (tmp ) & 0xffff;
sa2[i] = (tmp >> 16) & 0xffff;
}
方法二:SSE2
for (int i = 0; i < size / 8; i++){
__m128i a0 = ((__m128i*)x)[2*i + 0];
__m128i a1 = ((__m128i*)x)[2*i + 1];
a0 = _mm_shufflelo_epi16(a0,216);
a1 = _mm_shufflelo_epi16(a1,216);
a0 = _mm_shufflehi_epi16(a0,216);
a1 = _mm_shufflehi_epi16(a1,216);
a0 = _mm_shuffle_epi32(a0,216);
a1 = _mm_shuffle_epi32(a1,216);
((__m128i*)sa1)[i] = _mm_unpacklo_epi64(a0,a1);
((__m128i*)sa2)[i] = _mm_unpackhi_epi64(a0,a1);
}
如果进一步展开循环,最后一个例子会非常快。如果这可以击败所有字节操作库,我不会感到惊讶。
但是,它有以下限制:
前两个可以通过清理代码解决。这很困惑,但如果您真的想要性能,那可能是值得的。
编辑:
是的,这违反了严格别名,但不这样做几乎不可能使用 SSE 内在函数。
关于c++ - 给定一个整数数组,将数组从中间拆分为两个短数组的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550102/
我有一个数组列表: ArrayList allText = new ArrayList(); 其内容是这样的: [Alabama - Montgomery, Alaska - Juneau, Ariz
我有一个 timestamp 格式的开始和结束时间。我想将它们分成多个时间段,例如 1 小时。 $t1 = strtotime('2010-05-06 12:00:00'); $t2 = strtot
我需要将 span10 分成 3 列,但我无法将它们排列起来。我应该在 span10 中添加一个 span12 还是使用 offset 还是??
我有一个时间序列。我想从早上 8 点到第二天早上 7:59 分成 24 小时的区 block 。我知道如何按日期分组,但我尝试过使用 TimeGroupers 和 DateOffsets 处理这个 8
我收到“街道号码邮政编码城市”形式的地址(作为字符串)。我想要做的是将街道和号码与邮政编码和城市分开。通常你可以按空格分割。但有些街道名称中也有空格,例如:“Emile Van Ermengemlaa
我有一个用户列表。其中一些用户处于第一状态,而其他用户处于第二状态。所以我想要的是将这个列表显示为首先,它按排序顺序显示存在 = 1 的用户,然后按排序顺序显示存在 = 2 的用户。这里的排序是根据用
我感觉我搜索了整个网络,但找不到一种方法将不同高度的 div 很好地划分为 3 列,就像 http://www.ing.nl 上那样 headertekst headerteksttesth
Bootstrap 3 按钮下拉菜单出现问题。你可以在这里看到我的两个例子: http://www.bootply.com/W1dLusilMk http://www.bootply.com/GGBv
我在 php 中执行以下操作 foreach($QuestionAsekd as $k => $v){ $grp_name = $v['NAME']; $groupValues[$gr
我找到了一种用pandas解析html的绝妙方法。我的数据格式有点奇怪(见下文)。我想将这些数据拆分为 2 个单独的数据帧。 注意每个单元格如何由,分隔...是否有任何真正有效的方法来分割所有这些单元
HTML 看起来像这样,但我不允许对其进行更改。我只能编写 CSS 将其变成 2 列。 Povezave www.behance.net www.kiberpipa.org www.o
假设我有以下数据框“A” utilization utilization_billable service 1
我需要将 2 个文本框拉伸(stretch)到 100% 的浏览器宽度,以及一个提交按钮。所有三个都应该在一行中,我试图拉伸(stretch)它但它没有发生......有什么想法吗? 代码: .sea
我是一名优秀的程序员,十分优秀!