Tag: 位掩码

更改字节中的特定位组

我正在处理一个接收字节的函数,需要更改该字节中的一些位。 例如,该函数接收: 11001011 然后我需要将MSB设置为0,这很容易: buffer[0] &= ~(1 << 7); 但是我需要将第6位到第3位(我在这里将LSB称为位0)设置为提供给函数的参数。 该参数可以是0到6之间的整数。 重要的是我不应该改变任何其他位。 我试着掩盖和东西,但我失败了。 然后作为最后的手段,我在下面痛苦地做了。 它工作正常…但它很丑陋,并产生大量的指令,使代码运行缓慢: switch(regAddress) { case 0: buffer[0] &= ~(1 << 5); buffer[0] &= ~(1 << 4); buffer[0] &= ~(1 << 3); break; case 1: buffer[0] &= ~(1 << 5); buffer[0] &= ~(1 << 4); buffer[0] |= (1 << 3); break; //YOU GOT […]

形成和检查位掩码的方法

这很可能之前已被问及并得到解答,但我的搜索是徒劳的。 问题是关于位,字节掩码和检查。 假设有一个“触发器” 0xC4和0xC5 : 196: 1100 0100 0xc4 197: 1100 0101 0xc5 检查var是否为的简单方法是: if (var == 0xc5 || var == 0xc4) { } 但有时人们会看到这个(或类似的): if ( ((var ^ magic) & mask) == 0) { } 我的问题是如何找到魔法和面具 。 使用哪些方法,程序,技巧等来形成这些值并断言是否存在? 编辑: 澄清。 是的,在这个确切的例子中,前者会比后者更好,但我的问题更像是生成和检查这些类型的掩码。 总的来说有点笨拙。 我省略了很多,并试图使问题变得简单。 但…… 作为一个例子,我看了一下OllyDbg反编译源的来源,其中一个发现: if (((code ^ pd->code) & pd->mask) == 0) FOUND […]

如何在C中创建最小有效位设置为1的掩码

有人可以向我解释这个function吗? 具有最低有效n位的掩码设置为1。 例如: n = 6 – > 0x2F,n = 17 – > 0x1FFFF //我根本得不到这些,尤其是n = 6 – > 0x2F 还有什么是面具?

在C中匹配二进制模式

我正在开发一个需要解析一些定制数据结构的C程序,幸运的是我知道它们是如何构造的,但是我不知道如何在C中实现我的解析器。 每个结构的长度为32位,每个结构都可以通过它的二进制签名来识别。 例如,我感兴趣的有两种特殊结构,它们具有以下二进制模式(x表示0或1) 0000-00xx-xxxx-xxx0 0000-10xx-10xx-xxx0 在这些结构中,’x’位包含我需要的实际数据,因此基本上我需要一种基于每个结构中如何写入位来识别每个结构的方法。 所以作为伪代码中的一个例子: if (binaryPattern = 000010xxxxxxxxx0) { do something with it; } 我猜测将它们作为整数读取,然后执行某种bitmasking将是要走的路,但我对C的了解不是很好,也许一个简单的逻辑OR运算就可以做到,但我只想要一些在我开始之前做这个的建议。 谢谢 非常感谢所有回答的人,非常有帮助!

将屏蔽位移到lsb

当你and一些带掩码的数据得到一些与数据/掩码大小相同的结果时。 我想要做的是取结果中的掩码位(掩码中有1)并将它们向右移动,使它们彼此相邻,我可以在它们上执行CTZ(计数尾随零) 。 我不知道如何命名这样的程序,所以谷歌让我失望了。 该操作最好不应是循环解决方案,这必须尽可能快地操作。 这是一个用MS Paint制作的令人难以置信的图像。

计数位数

重复: 计算32位整数中设置位数的最佳算法? 假设你有一个号码。 有没有办法在这个数字的二进制表示中计算等于1的位,而不是使用迭代? 我的意思是,有没有办法使用一些按位运算符和掩码在恒定时间内完成它。 我需要的解决方案适用于32位和64位架构。 啊差点忘了,我需要它用于C语言或汇编程序也很好。

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

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