相关疑难解决方法(0)

使用单个乘法提取位

我看到在使用了一个有趣的技术,答案另一个问题,并想好一点理解.

我们给出了一个无符号的64位整数,我们对以下几位感兴趣:

1.......2.......3.......4.......5.......6.......7.......8.......
Run Code Online (Sandbox Code Playgroud)

具体来说,我们希望将它们移到前八位,如下所示:

12345678........................................................
Run Code Online (Sandbox Code Playgroud)

我们不关心指示的位的值.,并且不必保留它们.

溶液是屏蔽掉不需要的位,并且乘以结果0x2040810204081.事实证明,这就是诀窍.

这种方法有多普遍?这种技术可以用来提取任何比特子集吗?如果不是,如何判断该方法是否适用于特定的位组?

最后,如何找到(a?)正确的乘数来提取给定的位?

c bit-manipulation multiplication

298
推荐指数
5
解决办法
2万
查看次数

英特尔x86汇编优化技术中的示例问题

我正在学习汇编程序很长一段时间,我正在尝试重写一些简单的过程\函数来查看性能优势(如果有的话).我的主要开发工具是Delphi 2007,第一个例子将使用该语言,但它们也可以很容易地翻译成其他语言.

问题表明:

我们给出了一个无符号字节值,其中八位中的每一位代表一行屏幕中的一个像素.每个单个像素可以是实心(1)或透明(0).换句话说,我们在一个字节值中包含8个像素.我想将这些像素解压缩成一个8字节的数组,就像最年轻的像素(位)将落在数组的最低索引之下一样,依此类推.这是一个例子:

One byte value -----------> eight byte array

10011011 -----------------> [1][1][0][1][1][0][0][1]

Array index number ------->  0  1  2  3  4  5  6  7
Run Code Online (Sandbox Code Playgroud)

下面我介绍解决问题的五种方法.接下来,我将展示他们的时间比较以及我如何衡量这些时间.

我的问题包括两部分:

1.

我问您详细的有关方法的答案DecodePixels4aDecodePixels4b.为什么方法4b有点慢4a

例如,如果我的代码没有正确对齐,它会慢一些,那么告诉我给定方法中哪些指令可以更好地对齐,以及如何做到这一点不破坏方法.

我想看看这个理论背后的真实例子.请记住,我正在学习汇编,我想从你的答案中获得知识,这使我将来能够编写更好的优化代码.

2.

你能写更快的常规DecodePixels4a吗?如果是,请提供并描述您已采取的优化步骤.通过更快的例程,我的意思是在测试环境中在最短的时间段内运行的例程,在此处提供的所有例程中.

允许使用所有Intel系列处理器以及与之兼容的处理器.

您将在下面找到我编写的例程:

procedure DecodePixels1(EncPixels: Byte; var DecPixels: TDecodedPixels);
var
  i3: Integer;
begin
  DecPixels[0] := EncPixels and $01;
  for i3 := 1 to 7 do
  begin
    EncPixels := EncPixels shr 1;
    DecPixels[i3] := …
Run Code Online (Sandbox Code Playgroud)

delphi optimization x86 assembly basm

21
推荐指数
3
解决办法
3835
查看次数

在位上旋转8x8块中的位的最快方法是什么?

我不确定我正在尝试做什么的确切术语.我有一个存储8x8块,每个字节存储一行.当我完成后,我希望每个字节存储一列.bits8 bytes

例如,当我完成时:

Byte0out = Byte0inBit0 + Byte1inBit0 + Byte2inBit0 + Byte3inBit0 + ...
Byte1out = Byte0inBit1 + Byte1inBit1 + Byte2inBit1 + Byte3inBit1 + ...
Run Code Online (Sandbox Code Playgroud)

C中表现良好的最简单方法是什么?

c embedded transpose matrix bitarray

8
推荐指数
2
解决办法
3951
查看次数

翻转字节数组 - 提高性能

我有一些代码管理从传感器阵列接收的数据.控制传感器的PIC使用8个SAR-ADC并行读取4096个数据字节.这意味着它读取前8个字节的最高有效位; 然后它读取它们的第二位,依此类推,直到第八位(最低位).
基本上,对于它读取的每8个字节,它创建(并向计算机发送)8个字节,如下所示:

// rxData[0] = MSB[7] MSB[6] MSB[5] MSB[4] MSB[3] MSB[2] MSB[1] MSB[0]
// rxData[1] = B6[7] B6[6] B6[5] B6[4] B6[3] B6[2] B6[1] B6[0]
// rxData[2] = B5[7] B5[6] B5[5] B5[4] B5[3] B5[2] B5[1] B5[0]
// rxData[3] = B4[7] B4[6] B4[5] B4[4] B4[3] B4[2] B4[1] B4[0]
// rxData[4] = B3[7] B3[6] B3[5] B3[4] B3[3] B3[2] B3[1] B3[0]
// rxData[5] = B2[7] B2[6] B2[5] B2[4] B2[3] B2[2] B2[1] B2[0]
// rxData[6] = B1[7] B1[6] B1[5] B1[4] B1[3] B1[2] B1[1] B1[0] …
Run Code Online (Sandbox Code Playgroud)

c# arrays performance bitarray

6
推荐指数
1
解决办法
1340
查看次数