Tag: bitwise operators

将各个位分配给字节

我需要在微控制器和另一个芯片之间进行SPI通信。 该芯片接受16位字。 但是抽象库需要将数据作为两个8位字节发送。 现在我想制作一个包装器,这样我就可以轻松创建读写请求……但我还没有取得任何成功。 这是它应该如何: 下表显示了16位。 MSB可以是0表示写入, 1表示读取。 地址可以是0x0到0x7 ,数据是11位。 R/W | ADDRESS | DATA B15 | B14-B11 | B10-B0 0 | 0000 | 00000000000 W0 | A3, A2, A1, A0 | D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0 例如,如果我想从寄存器0x1读取,我想我必须设置这样的位: W0 | A3, A2, A1, A0 | D10, D9, D8, D7, […]

使用C将整数值写入二进制文件

我试图将9位数写入二进制文件。 例如,我想写整数值:275为100010011 ,依此类推。 fwrite只允许一次写入一个字节,我不知道如何操作这些位才能做到这一点。

将9位值的流作为字节写入C中的文件

我有一个数组,其整数值从0-511(最多9位)。 我试图用fwrite写这个文件。 例如,使用数组: [257, 258, 259] Which is 100000001, 100000010, 100000011 I am trying to write 100000001100000010100000011 + extra padding of 0s to the file 但由于fwrite限制一次写入1个字节,我不知道该怎么做。 我是按位操作的新手,而不是如何分离各个字节。

为什么使用xor和文字而不是反转(按位不是)

我遇到过这个CRC32代码 ,很好奇为什么作者会选择使用它 crc = crc ^ ~0U; 代替 crc = ~crc; 据我所知,它们是等价的。 我甚至在Visual Studio 2010中反汇编了这两个版本。 未优化的构建: crc = crc ^ ~0U; 009D13F4 mov eax,dword ptr [crc] 009D13F7 xor eax,0FFFFFFFFh 009D13FA mov dword ptr [crc],eax crc = ~crc; 011C13F4 mov eax,dword ptr [crc] 011C13F7 not eax 011C13F9 mov dword ptr [crc],eax 我也无法通过考虑每条指令所需的周期数来certificate代码的合理性,因为两条指令都需要完成1个周期。 事实上, xor可能因为必须从某个地方加载文字而受到惩罚,尽管我不确定这一点。 所以我认为它可能只是描述算法的首选方式,而不是优化……这是正确的吗? 编辑1: […]

在unsigned int中设置最后的`n`位

如何设置(以最优雅的方式) uint32_t最低有效位? 那就是写一个函数void setbits(uint32_t *x, int n); 。 函数应该处理从0到32每个n 。 特别是应该处理n==32值。

NOT(〜)vs NEGATION(!)

#include using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) { cout<<i; ++i; } } 输出为-5,-4,-3,-2。 它不应该打印值直到-1?为什么它只到-2。 请解释一下’not’和’negation’运算符之间的区别。当我编写程序时,它们就是bug的来源。 while(i) 我知道循环条件对于正和负i都是正确的,除了0。 while(!i) vs while(~i) 对于’i’的值,上述两个循环是否被执行?

为什么XOR与整数交换会触发警告?

我输入了以下程序: #include int main(void) { int a = 3; int b = 42; printf(“a = %d\nb = %d\n”, a, b); printf(“Exchanging values.\n”); a ^= b ^= a ^= b; printf(“a = %d\nb = %d\n”, a, b); return 0; } 没关系。 当我尝试编译它时,我得到了这个: $ gcc test.c -o test -Wall -Wextra -ansi -pedantic-errors test.c: In function ‘main’: test.c:11: […]

C中的逻辑运算符有什么意义?

我只是想知道在C中是否有一个XOR逻辑运算符(类似于&& for AND但是对于XOR)。 我知道我可以将XOR分成AND,NOT和OR,但简单的XOR会好得多。 然后我发现如果我在两个条件之间使用普通的XOR位运算符,它可能会起作用。 对于我的测试,它做到了。 考虑: int i = 3; int j = 7; int k = 8; 仅仅为了这个相当愚蠢的例子,如果我需要k大于i或大于j而不是两者,XOR将是非常方便的。 if ((k > i) XOR (k > j)) printf(“Valid”); else printf(“Invalid”); 要么 printf(“%s”,((k > i) XOR (k > j)) ? “Valid” : “Invalid”); 我把按位XOR ^ ,它产生“无效”。 将两个比较的结果放在两个整数中导致2个整数包含1,因此XOR产生错误。 然后我用&和|尝试了 按位运算符和两者都给出了预期的结果。 知道真实条件具有非零值,而虚假条件具有零值,所有这些都是有意义的。 我在想,是否有理由使用逻辑&&和|| 当按位运算符&,| 和^工作一样吗?

按位运算符可以有未定义的行为吗?

按位运算符( ~ , & , |和^ )对其提升的操作数的按位表示进行操作。 这样的操作会导致不确定的行为吗? 例如, ~运算符在C标准中以这种方式定义: 6.5.3.3一元算术运算符 ~运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换的操作数中的相应位时,才设置结果中的每个位)。 整数提升在操作数上执行,结果具有提升类型。 如果提升类型是无符号类型,则表达式~E等于该类型中可表示的最大值减去E 在所有体系结构中, ~0产生一个位模式,符号位设置为1 ,所有值位设置为1 。 在一个补码架构上,该表示对应于负零。 这个位模式可以成为陷阱表示吗? 是否存在涉及更常见架构的简单位运算符的未定义行为的其他示例?

C&PHP:使用按位运算符将整数设置存储?

我不熟悉按位运算符,但我似乎以前用它们来存储简单的设置。 我需要将几个开/关选项传递给一个函数,我想为此使用一个整数。 我该如何设置和阅读这些选项?