相关疑难解决方法(0)

C/C++高效位数组

你能推荐有效/干净的方法来操纵任意长度的位数组吗?

现在我使用常规的int/char位掩码,但是当数组长度大于数据类型长度时,这些不是很干净.

std vector<bool> 不适合我.

c c++ arrays bit

32
推荐指数
4
解决办法
4万
查看次数

改变一个整数

我们有一个整数

int x = 50;
Run Code Online (Sandbox Code Playgroud)

在二进制中,它是

00110010
Run Code Online (Sandbox Code Playgroud)

如何以编程方式更改第四(第4)位?

c c++ bit-manipulation bitwise-operators

31
推荐指数
3
解决办法
4万
查看次数

Haswell/Skylake的部分寄存器究竟如何表现?写AL似乎对RAX有假依赖,而AH是不一致的

此循环在英特尔Conroe/Merom上每3个周期运行一次,imul按预期方式在吞吐量方面存在瓶颈.但是在Haswell/Skylake上,它每11个循环运行一次,显然是因为setnz al它依赖于最后一个循环imul.

; synthetic micro-benchmark to test partial-register renaming
    mov     ecx, 1000000000
.loop:                 ; do{
    imul    eax, eax     ; a dep chain with high latency but also high throughput
    imul    eax, eax
    imul    eax, eax

    dec     ecx          ; set ZF, independent of old ZF.  (Use sub ecx,1 on Silvermont/KNL or P4)
    setnz   al           ; ****** Does this depend on RAX as well as ZF?
    movzx   eax, al
    jnz  .loop         ; }while(ecx);
Run Code Online (Sandbox Code Playgroud)

如果setnz al …

x86 assembly intel cpu-architecture micro-optimization

30
推荐指数
2
解决办法
1537
查看次数

如何在C中仅设置某个字节的某些位而不影响其余位?

假设我有一个类似于1010XXXX的字节,其中X值可以是任何值.我想将低4位设置为特定模式,比如1100,同时保持高4位不受影响.如何在C中以最快的速度完成这项工作?

c byte bitmask

19
推荐指数
2
解决办法
3万
查看次数

设置/取消设置单个位的简单方法

现在我用它来设置/取消设置一个字节中的各个位:

if (bit4Set)
   nbyte |= (1 << 4);
else
   nbyte &= ~(1 << 4);
Run Code Online (Sandbox Code Playgroud)

但是,你不能以更简单/更优雅的方式做到这一点吗?就像在一次操作中设置或取消设置一样?

注意:我知道我可以写一个函数来做到这一点,我只是想知道我是否不会重新发明轮子.

c++ bit-manipulation

18
推荐指数
4
解决办法
2万
查看次数

如何使用c替换位域中的位而不影响其他位

我想在32/64位数据字段中替换位/位(大于1)而不影响其他位.例如:

我有一个64位寄存器,其中第5位和第6位可以取值0,1,2,3.

5:6    
0 0
0 1
1 0
1 1     
Run Code Online (Sandbox Code Playgroud)

现在,当我读取寄存器时,我得到值0x146(0001 0 10 0 0110).现在我想将第5位和第6位的值更改为01.(现在它是10,十进制是2,我想要在没有其他位受到影响的情况下将其替换为1 e 01)并仅在修改了位5和6的情况下写回寄存器(因此在更改后变为126)

我试过这样做

reg_data=0x146
reg_data |= 1 << shift   (shift in this case is 5)
Run Code Online (Sandbox Code Playgroud)

如果我在位5和6处执行该值将变为11(0x3)而不是01(0x1),这是我想要的.

  • 我如何进行读/修改/写?
  • 如何在不影响使用C的字段的整个数据的情况下,仅替换32/64位字段中的某些位/位?

设置一点是可以的,但不止一点,我发现它有点困难.

任何建议都非常感谢.

c bit-manipulation

18
推荐指数
3
解决办法
3万
查看次数

如何使用Java Sound中的音频样本数据?

这个问题通常被问到是另一个问题的一部分,但事实证明答案很长.我决定在这里回答它,所以我可以在其他地方链接到它.

虽然我不知道Java此时可以为我们生成音频样本的方式,但如果将来发生变化,这可能是一个适合它的地方.我知道JavaFX有一些这样的东西,例如AudioSpectrumListener,但仍然不能直接访问样本.


我正在javax.sound.sampled用于播放和/或录制,但我想对音频做些什么.

也许我想直观地展示它或以某种方式处理它.

如何使用Java Sound访问音频样本数据?

也可以看看:

java audio javasound audio-processing javax.sound.sampled

18
推荐指数
1
解决办法
9775
查看次数

快速向后转动大块内存

我需要以相反的顺序重写大约4KB的数据,在位级(最后一个字节的最后一位成为第一个字节的第一位),尽可能快.有没有聪明的小册子呢?

理由:数据是嵌入式设备中LCD屏幕的显示内容,通常以屏幕处于肩膀水平的方式定位.屏幕有"6点钟"的方向,可以从下面看 - 就像平躺或挂在眼睛上方.这可以通过将屏幕旋转180度来固定,但是我需要从屏幕的左上角开始反转屏幕数据(由库生成),即1位= 1像素.CPU功能不是很强大,设备已经有足够的工作量,加上一秒钟的几帧,所以性能是个问题.RAM不是那么多.

编辑:单核,ARM 9系列.64MB,(缩小到32MB以后),Linux.数据通过8位IO端口从系统存储器推送到LCD驱动器.

CPU为32位,在字长方面的性能要比字节级高得多.

c optimization performance

13
推荐指数
4
解决办法
1565
查看次数

在int中设置特定位

我需要通过为每个可能的数据库值设置int值中的特定位来屏蔽从数据库读取的某些字符串值.例如,如果数据库返回字符串"value1",则位置0中的位需要设置为1,但如果数据库返回"value2",则位置1中的位需要设置为1.

如何确保int的每个位最初设置为0然后再打开指定的位?

c# bit-manipulation

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

在C++中使特定位"0"

我是编程新手.最近我遇到了一个问题,我必须在一个数字的特定位0.

例如 :

我有一个数字p

p      = 73
binary = 1001001
Run Code Online (Sandbox Code Playgroud)

现在我想将第4位设为0,即1000001(2)= 65(10)

我是按照以下方式做到的:

int p = 73;
int pos = 1<<3; // 4th bit
int max_bit = (1<<31) - 1; // making all bit to 1
int mask = pos ^ max_bit; // making 4th bit to 0 except others
p = p & mask; // changing 4th bit of p to 0
cout<<p<<endl;
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗 ?

c++ bit

11
推荐指数
1
解决办法
1369
查看次数