Tag: 位操作

c:位反转逻辑

我正在查看下面的位反转代码,只是想知道如何提出这些事情。 (来源: http : //www.cl.cam.ac.uk/~am21/hakmemc.html ) /* reverse 8 bits (Schroeppel) */ unsigned reverse_8bits(unsigned41 a) { return ((a * 0x000202020202) /* 5 copies in 40 bits */ & 0x010884422010) /* where bits coincide with reverse repeated base 2^10 */ /* PDP-10: 041(6 bits):020420420020(35 bits) */ % 1023; /* casting out 2^10 – 1’s */ } […]

ASCII压缩器适用于短测试文件,而不是长时间

系统编程中的当前项目是提出一个ASCII压缩器,它删除顶部的零位并将内容写入文件。 为了便于解压缩,将原始文件大小写入文件,然后压缩char字节。 有两个文件可以运行测试 – 一个是63字节长,另一个是5344213字节。 我的代码在第一个测试文件中按预期工作,因为它写入56个字节的压缩文本和4个字节的文件头。 但是,当我在长测试文件上尝试它时,压缩版本比原始版本短3个字节,当它应该大约小749KiB,或原始大小的14%。 我已经计算出长测试文件的前两个写循环的二进制位移值,它们匹配我的测试打印输出中记录的内容。 while ( (characters= read(openReadFile, unpacked, BUFFER)) >0 ){ unsigned char packed[7]; //compression storage int i, j, k, writeCount, endLength, endLoop; //loop through the buffer array for (i=0; i< characters-1; i++){ j= i%7; //fill up the compressed array packed[j]= packer(unpacked[i], unpacked[i+1], j); if (j == 6){ writeCalls++; //track […]

在C中设置最重要的位

我试图在长的无符号x中设置最重要的位。 要做到这一点,我使用这行代码: x |= 1<<((sizeof(x)*8)-1); 我认为这应该工作,因为sizeof以字节为单位给出大小,所以我乘以8并减去1来设置最后一位。 每当我这样做时,编译器都会出现此警告:“警告:左移计数> =类型的宽度” 我不明白为什么会出现这种错误。

如何更改32位寄存器特定位而不更改其他位?

我想直接使用其物理地址来操作寄存器的某些位。 但是我找不到办法做到这一点。 我看到一些关于设置位掩码的post,但我觉得它们太混乱了。 我的寄存器物理地址是: 0x4A10005C 我想操纵它在18-16位之间的位。 我想在这些位内设置0x3 。 如果你们能提供答案或办法,我将非常高兴。 谢谢。

高阶位 – 取出它们并将uint64_t转换为uint8_t

假设您有一个uint64_t,并且只关心uint64_t中每个字节的高位。 像这样: uint32_t:0000 … 1000 0000 1000 0000 1000 0000 1000 0000 —> 0000 1111 有没有比以下更快的方式: return ( ((x >> 56) & 128)+ ((x >> 49) & 64)+ ((x >> 42) & 32)+ ((x >> 35) & 16)+ ((x >> 28) & 8)+ ((x >> 21) & 4)+ ((x >> 14) & 2)+ ((x >> […]

如何在位图中的位之间插入零?

我有一些性能很重的代码执行位操作。 它可以简化为以下明确定义的问题: 给定一个13位位图,构造一个26位位图,其中包含在偶数位置间隔的原始位 。 为了显示: 0000000000000000000abcdefghijklm (input, 32 bits) 0000000a0b0c0d0e0f0g0h0i0j0k0l0m (output, 32 bits) 我目前在C中以下列方式实现它: if (input & (1 << 12)) output |= 1 << 24; if (input & (1 << 11)) output |= 1 << 22; if (input & (1 << 10)) output |= 1 << 20; … 我的编译器(MS Visual Studio)将其转换为以下内容: test eax,1000h jne 0064F5EC […]

为空间优化一系列tribools

让我先从一些背景知识开始: 通过“tribool”,我理解一个可以包含以下值之一的变量: true , false或null 。 有问题的是复制int的数组和指向 bool的指针 ,OP希望有一个尽可能小的tribools数组(或多或少)。 使用“一点点”最基本的bit-fu,我提出了一个解决方案,每个tribool使用2位,并允许以16字节存储OP的64个tribool数组,这是可以的。 我使用的tribool机制非常简单,如: boolean A表示“null或not null”, boolean B表示“如果不为null则为true或false”。 但后来我想……一个“位”的算法定义是: 一位是指定两个同等可能事件中的哪一个应发生的信息量。 显然,真/假值是1位大。 两个真假值整体上是2位大。 那么我们的概念摩擦呢呢? 我的观点是: 就所包含信息的大小而言,tribool大于1位但小于2位 。 理由1:假设我们实现了如上所述的if boolean。 如果布尔A为“null”,则布尔值B的值是多余的,并且不携带任何相关信息。 理由2:在一个tribool中存储来自2个独立布尔值的信息是不可能的,所以它有 (以上都不是正式的证据,但我相信我们可以同意关于tribool的“大小”严格大于1位且严格小于2。) 我的问题是: 如何以编程方式利用tribool信息少于2位的事实,并在软件 (c,c ++?)中实现一个N triboolsarrays,对于某些N,其内存占用量小于N/4字节? 是的,我确实理解这样的实现并不是真正的硬件友好,并且执行速度比任何具有冗余的常见解决方案都要慢(如OP的问题所示)。 让我们优化空间,而不是效率。 很明显,这种实现需要一种摩博尔的不同表示而不是一对bool(这本身就是多余的,如前所述)。 该理论认为可以实现这一目标,我希望看到实际的实施。 有任何想法吗?

如何判断32位int是否适合16位短路

仅使用: ! ~ & ^ | + <> 我需要找出一个带符号的32位整数是否可以表示为16位,二进制补码整数。 我的第一个想法是分离MSB 16位和LSB 16位,然后使用掩码和最后16位,所以如果它不为零,它将无法表示,然后使用该数字来检查MSB位。 我需要编写的函数示例是:fitsInShort(33000)= 0(无法表示)和fitsInShort(-32768)= 1(可以表示)

是否有一个明智的技巧来检查数字的可分性为2或3?

我正在寻找相当于(num%2) == 0 || (num%3) == 0逐位测试 (num%2) == 0 || (num%3) == 0 。 我可以用num&1替换num%2 ,但我仍然坚持使用num%3和逻辑 – 或者。 这个表达式也等同于(num%2)*(num%3) == 0 ,但我不确定这有多大帮助。

如何使用按位运算符返回0或1

我的函数接受32位int,如果该数字在任何偶数位置都有1,我需要返回0或1。 我不能使用任何条件语句我也一次只能访问8位。 以下是输入示例:10001000 01011101 00000000 11001110 1)用AA(10101010)移动位和它们并将每个位存储在一个变量中。 int a = 10001000 int b = 1000 int c = 0 int d = 10001010 现在,如果没有设置奇数位,我需要返回0,如果有,则需要返回1。 我们可以看到有。 所以我需要将这些组合成一个数字,然后使用!! 操作员返回0或1.这是我遇到麻烦的地方。 int valueToReturn = a | b | c | d; 现在我需要说: return !!valueTOReturn; 它不是回报正确的价值任何人都可以给我任何洞察力??? 我不能使用任何条件语句,如|| && 我想到了。 我说的所有内容都给出了正确答案,但我抓住了其中一个变量的错误值。 感谢您的帮助!