Tag: 位操作

C中的按位索引?

我正在尝试实现我已经拥有的数据压缩思想,并且因为我想要在大量的测试数据库中运行它,我曾想过用C语言编写代码(我主要有像Ruby这样的脚本语言的经验。 TCL)。 通过关于C的O’Reilly’牛’书,我意识到我不能简单地索引一个简单的’char’或’int’类型变量的位,因为我想做按位比较和运算符。 我认为这是正确的吗? 使用枚举类型表示一个位(并创建这些数组,并编写函数转换为char和从char转换)是否合理? 如果是这样,是否已在某个标准库中定义了这样的类型和函数? 还有其他(更好的?)方法吗? 是否有人可以指向我的某些示例代码? 谢谢 –

标记/编码指针

我需要一种方法来将指针标记为集合x的一部分或集合y的一部分(即:标记只有2个’状态’),我就是这意味着可以假定无标记= x和标记= y。 目前我正在寻找使用bitwise xor来做到这一点: ptr ^ magic = encoded_ptr encoded_ptr ^ magic = ptr 但我很难知道如何确定指针是否在第一位被标记。 我用它来标记链表中的哪些池节点来自哪里,这样当它们脱链时,它们可以回到正确的perants。 更新 只是为了让所有那些建议将标志存储在额外数据成员中的人清楚,我只限于sizeof(void*) ,所以我不能添加新成员,否则我会有。 此外,池不是连续的,它们由许多页面组成,跟踪范围会增加太多开销(我是在快速简单的解决方案之后,如果可以调用它)。

如何以便携方式在C中执行算术右移?

我们正在编写一个模拟器,我们需要传播右移的符号。 仿真系统使用2的补码。 我读到C中有符号整数的>>运算符是实现定义的。 所以我不能依赖它将在所有平台中产生正确的位模式的事实。 这意味着我需要使用位操作来重现算术右移,如果可能的话我想避免不必要的分支。 编辑: 回应评论: “缺少的一点是,当符号位在x中设置为x >> y时,OP需要定义什么结果是”正确的“ 我基本上想要重现SAR x86指令的行为。 在那里,负数用2的补码表示。 对于负数,右移基本上应该除以2。 这意味着从1开始的位模式。因此对于1xxxxxxx,右移应该得到11xxxxxx。 对于以0开头的位模式,所以0xxxxxxx右移应该导致00xxxxxx。 所以MSB是“粘性的”。 没有定义超过字长的移位。

形成和检查位掩码的方法

这很可能之前已被问及并得到解答,但我的搜索是徒劳的。 问题是关于位,字节掩码和检查。 假设有一个“触发器” 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位操作/从一个字节到另一个字节复制一位

我知道如何设置一个位,清除一点,切换一下,并检查是否设置了一个位。 但是,我如何将bit,例如byte_1的nr 7复制到byte_2中的bit nr 7? 没有if语句(没有检查位的值)是可能的吗? #include #include int main(){ int byte_1 = 0b00001111; int byte_2 = 0b01010101; byte_2 = // what’s next ? return 0; }

按位左移一个16的无符号字符是什么意思

我正在读取包含unsigned char变量的.cpp文件,它尝试按位左移16位,因为unsigned char由8位组成,左移16位将擦除所有位并用8位填充它。 unsigned char byte=0xff; byte << 16;

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

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

表示数字x所需的位数

我目前正在尝试编写一种算法来确定表示数字x所需的位数。 我的实现将在c。 虽然有一些捕获,但我仅限于按位运算符{〜,&,^,|,+,<>}。 另外,我不能使用任何类型的控制流程(if,while,for)。 我最初的方法是从左到右检查二进制数,并查找第一个’1’出现的位置。 鉴于我的限制,我不确定如何处理这个问题。 我正在使用的数字可以被认为是无符号整数。 所以00110只需要3位。 我想知道是否有更容易/更清洁的方法来做到这一点,我想念它? 或者,如果有人可以提供一些提示? 基本上,我试图在没有while循环的情况下实现它: int result = 0; while (x >>= 1) { result += 1; } return result;

如何在O(1)时间内找到二进制数的1?

我知道之前已经问过,但我正在看这里列出的特定解决方案: int BitCount(unsigned int u) { unsigned int uCount; uCount = u – ((u >> 1) & 033333333333) – ((u >> 2) & 011111111111); return ((uCount + (uCount >> 3)) & 030707070707) % 63; } 它是如何工作的? 这里有什么警告吗? 理论上可以在恒定的时间内找到答案吗? 我的意思是,我们不是必须迭代这些位来计算?

将文件以位forms写入C中的文件

我在C中实现了霍夫曼算法。我已经获得了基本function,直到获得二进制代码字。 例如,abcd将是100011000或类似的东西。 现在的问题是如何在压缩文件中以二进制forms编写此代码。 我的意思是如果我正常写它每1和0将是一个字符,所以没有压缩。 我需要用它们的位forms写出1和0。 是这样可能在C.如果是这样如何?