你能推荐有效/干净的方法来操纵任意长度的位数组吗?
现在我使用常规的int/char位掩码,但是当数组长度大于数据类型长度时,这些不是很干净.
std vector<bool> 不适合我.
我们有一个整数
int x = 50;
Run Code Online (Sandbox Code Playgroud)
在二进制中,它是
00110010
Run Code Online (Sandbox Code Playgroud)
如何以编程方式更改第四(第4)位?
此循环在英特尔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 …
假设我有一个类似于1010XXXX的字节,其中X值可以是任何值.我想将低4位设置为特定模式,比如1100,同时保持高4位不受影响.如何在C中以最快的速度完成这项工作?
现在我用它来设置/取消设置一个字节中的各个位:
if (bit4Set)
nbyte |= (1 << 4);
else
nbyte &= ~(1 << 4);
Run Code Online (Sandbox Code Playgroud)
但是,你不能以更简单/更优雅的方式做到这一点吗?就像在一次操作中设置或取消设置一样?
注意:我知道我可以写一个函数来做到这一点,我只是想知道我是否不会重新发明轮子.
我想在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),这是我想要的.
设置一点是可以的,但不止一点,我发现它有点困难.
任何建议都非常感谢.
这个问题通常被问到是另一个问题的一部分,但事实证明答案很长.我决定在这里回答它,所以我可以在其他地方链接到它.
虽然我不知道Java此时可以为我们生成音频样本的方式,但如果将来发生变化,这可能是一个适合它的地方.我知道JavaFX有一些这样的东西,例如AudioSpectrumListener,但仍然不能直接访问样本.
我正在javax.sound.sampled用于播放和/或录制,但我想对音频做些什么.
也许我想直观地展示它或以某种方式处理它.
如何使用Java Sound访问音频样本数据?
也可以看看:
我需要以相反的顺序重写大约4KB的数据,在位级(最后一个字节的最后一位成为第一个字节的第一位),尽可能快.有没有聪明的小册子呢?
理由:数据是嵌入式设备中LCD屏幕的显示内容,通常以屏幕处于肩膀水平的方式定位.屏幕有"6点钟"的方向,可以从下面看 - 就像平躺或挂在眼睛上方.这可以通过将屏幕旋转180度来固定,但是我需要从屏幕的左上角开始反转屏幕数据(由库生成),即1位= 1像素.CPU功能不是很强大,设备已经有足够的工作量,加上一秒钟的几帧,所以性能是个问题.RAM不是那么多.
编辑:单核,ARM 9系列.64MB,(缩小到32MB以后),Linux.数据通过8位IO端口从系统存储器推送到LCD驱动器.
CPU为32位,在字长方面的性能要比字节级高得多.
我需要通过为每个可能的数据库值设置int值中的特定位来屏蔽从数据库读取的某些字符串值.例如,如果数据库返回字符串"value1",则位置0中的位需要设置为1,但如果数据库返回"value2",则位置1中的位需要设置为1.
如何确保int的每个位最初设置为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)
有一个更好的方法吗 ?