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 […]

类似位运算符之间的差异

在引用逐位运算符时,有什么区别! 和〜? 我觉得他们都翻了一下,但是1可能会给最后的答案增加1分? ~0xC4 compared to !0xC4 谢谢!

使用位操作将整数转换为浮点数在C中的某些整数上打破

在类赋值上工作时,我试图仅使用位操作将整数强制转换为浮点数(限于任何整数/无符号运算,包括||,&&。也if,while)。 我的代码适用于大多数值,但有些值不能生成我正在寻找的结果。 例如,如果x是0x807fffff,我得到0xceff0001,但正确的结果应该是0xceff0000。 我想我的尾数和四舍五入都缺少一些东西,但不能把它固定下来。 我已经查看了SO上的其他一些线程以及转换为int-to-float和如何手动操作 unsigned dl22(int x) { int tmin = 0x1 << 31; int tmax = ~tmin; unsigned signBit = 0; unsigned exponent; unsigned mantissa; int bias = 127; if (x == 0) { return 0; } if (x == tmin) { return 0xcf << 24; } if (x < 0) { signBit […]

32位整数掩码

我正在完成一些CSE作业,我有一个关于声明更大比特大小的整数的快速问题。 我的任务是实现一个函数,如果x的任何奇数位为1(假设x的大小为32位),则返回1,否则返回0。 我允许声明一个具有位值的整数: 10101010101010101010101010101010 如果是这样,那么可能会出现任何问题吗? 如果没有,为什么不呢? 我有什么替代品? 我的function: int any_odd_one(unsigned x) { int mask = 10101010101010101010101010101010 if(x & mask) { return 1; } else { return 0; } } 在此先感谢您的任何帮助! -Matt

用于从H / W寄存器读取的位字段

我想从32位寄存器读取第2,第5和第6位。 我决定使用struct位字段来存储它们。 以下数据结构是否正确? struct readData { int unwanted:1; int reqbit1:1; int unwanted1:2; int reqbit2:2; int unwanted2:26; }; 我不确定如何创建位字段。 我将使用一个API,它将字节从h / w寄存器直接复制到此结构。 在那种情况下,reqbit1会包含第二位吗? 根据我的理解,编译器将第一位分配给一个int变量,第二位分配给另一个int变量,因此reqbit1将不会从寄存器中读取任何数据。 以下联盟不适合这种情况吗? union readData { struct readBits{ bool unwanted:1; bool reqbit1:1; xxx unwanted1:2; short reqbit2:2; xxx unwanted2:26; }; int regValue; }; 如果这是对的,我应该将不想要的2声明为什么?

所有8位的按位移位会发生什么

我在c中有一个小查询,我在数字69上使用按位左移,这是二进制的01000101 01000101 << 8 我的答案是100010100000000 不应该是全部8个零,即00000000因为我们将所有8位向左移动然后用零填充。

如何使用按位运算符交错2个布尔值?

假设我有两个4位值, ABCD和abcd 。 如何使用按位运算符对其进行交错,使其成为AaBbCcDd ? 伪C中的示例: nibble a = 0b1001; nibble b = 0b1100; char c = foo(a,b); print_bits(c); // output: 0b11010010 注意:4位仅用于说明,我想用两个32位整数执行此操作。

C比较两个位图的最快方法

char数组forms有两个位图数组,有数百万条记录。 什么可能是使用C比较它们的最快方法。 我可以想象在for循环中一次使用按位运算符xor 1个字节。 关于位图的重点: 算法运行的时间为1%到10%,位图可能不同。 大多数时候他们都是一样的。 当嘿可以不同时,它们可以高达100%。 连续条纹中的位变化概率很高。 两个位图的长度相同。 目标: 检查它们是否有所不同,如果是,则在哪里。 每次都是正确的(如果有的话,检测错误的概率应为1)。

C中的括号是否可以更改按位运算的操作数的结果类型?

我通过静态分析工具提供了以下代码: u1 = (u1 ^ u2); // OK u1 = (u1 ^ u2) & u3; // NOT OK u1 = (u1 ^ u2) & 10; // NOT OK u1 = (u1 ^ u2) & 10U; // NOT OK u1 = (unsigned char)(u1 ^ u2) & 10U; // OK u1 = (unsigned char)(u1 ^ u2) & […]

为什么-1 >> 1和0xFFFFFFFF >> 1产生不同的结果?

我试图通过右移hexFFFFFFFF来判断我的PC是执行算术还是逻辑右移。 我知道整数-1以hex读取为FFFFFFFF ,因为它是1的二进制补码。 右移-1乘以FFFFFFFF并显示PC执行算术右移。 但是,如果我只输入0xFFFFFFFF >> 1 ,则会产生7FFFFFFF并显示PC执行逻辑右移。 为什么会这样? 请参阅下面生成结果的代码: #include #include int main ( int argc, char *argv[] ) { printf ( “%x >> 1 = %x\n”, -1, -1 >> 1 ); printf ( “%x >> 1 = %x\n”, 0xffffffff, 0xffffffff >> 1 ); return EXIT_SUCCESS; } 该计划的输出是: ffffffff >> 1 = ffffffff ffffffff […]