Tag: 位操作

将各个位分配给字节

我需要在微控制器和另一个芯片之间进行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, […]

如何使用按位添加位?

我试图找出如何仅使用以下按位运算来添加位(最多2个字节):〜&^ | <>。 我一直试着没有运气。 我想知道是否有人知道如何。 int logicalByteAdd(int x, int y) { return ; }

更改字节中的特定位组

我正在处理一个接收字节的函数,需要更改该字节中的一些位。 例如,该函数接收: 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 […]

isGreater按位C操作 – 两个数字中最大的一个

按位操作,我必须找到两个数字中最大的一个。 这些是相同的规则: /* * isGreater – if x > y then return 1, else return 0 * Example: isGreater(4,5) = 0, isGreater(5,4) = 1 * Legal ops: ! ~ & ^ | + <> * Max ops: 24 */ 这是我为此编写的代码: int isGreater(int x, int y) { /* to find greater, subtract y from x using […]

掩盖最重要的一点

我写了这个函数来删除每个字节中最重要的位。 但是这个function似乎并没有像我希望的那样工作。 输出文件大小始终为“0”,我不明白为什么没有写入输出文件。 是否有更好,更简单的方法来删除每个字节中最重要的位?

左移算子

如果我有以下内容: char v = 32; // 0010 0000 然后我做: v << 2 这个号码是负面的。 // 1000 0000 -128 我读了标准,但只写了: 如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为是未定的。 所以我不明白,如果一个规则是,如果有一点在大多数左边的位上,那么这个数字必须从负数开始。 我正在使用GCC。

按位C代码舍入问题

我必须遵循按位代码,它将浮点值(打包在int中)转换为int值。 问题:存在舍入问题,因此在输入为0x80000001的情况下失败。 我该如何处理? 这是代码: if(x == 0) return x; unsigned int signBit = 0; unsigned int absX = (unsigned int)x; if (x < 0) { signBit = 0x80000000u; absX = (unsigned int)-x; } unsigned int exponent = 158; while ((absX & 0x80000000) == 0) { exponent–; absX <> 8; unsigned int result = signBit | […]

钳制实际(固定/浮点)值的最快方法?

有没有比使用if语句或三元运算符更有效的方法来钳制实数? 我想为双打和32位修复点实现(16.16)做到这一点。 我不是要求代码可以处理这两种情况; 它们将在不同的function中处理。 显然,我可以这样做: double clampedA; double a = calculate(); clampedA = a > MY_MAX ? MY_MAX : a; clampedA = a < MY_MIN ? MY_MIN : a; 要么 double a = calculate(); double clampedA = a; if(clampedA > MY_MAX) clampedA = MY_MAX; else if(clampedA < MY_MIN) clampedA = MY_MIN; fixpoint版本将使用函数/宏进行比较。 这是在代码的性能关键部分完成的,所以我正在寻找一种尽可能有效的方法(我怀疑它会涉及位操作) 编辑:它必须是标准/便携式C,平台特定的function在这里没有任何兴趣。 此外, […]

IEEE 754到C语言的十进制

我正在寻找将浮点数转换为C中的十进制表示的最佳方法。我将尝试给出一个示例:用户在IEEE754(1 1111111 10101 …)中引入一个数字,程序必须返回十进制表示(例如25.6) 我尝试过使用掩码和按位操作,但我没有任何逻辑结果。

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

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