Tag: 位操作

是 – !(条件)从boolean(mask-boolean)获取完整位向量的正确方法?

在从高性能代码中删除条件分支时,将真实布尔值转换为unsigned long i = -1以设置所有位可能很有用。 我想出了一种从int b (或bool b )的输入获取此integer-mask-boolean的方法,取值为1或0 : unsigned long boolean_mask = -(!b); 获得相反的价值: unsigned long boolean_mask = -b; 以前有人看过这个建筑吗? 我有事吗? 当int值-1(我假设-b或-(!b)确实生成)被提升为更大的unsigned int类型时,它是否保证设置所有位? 这是上下文: uint64_t ffz_flipped = ~i&~(~i-1); // least sig bit unset // only set our least unset bit if we are not pow2-1 i |= (ffz_flipped < i) ? ffz_flipped […]

整数溢出与减法

好的,所以我需要实现一个返回零或一的方法,具体取决于xy是否导致溢出。 Example: subTract(0x80000000,0x80000000) = 1, subTract(0x80000000,0x70000000) = 0, 我不是在寻找这种方法的实现。 我不明白哪一个应该导致溢出,并且几乎不可能开始。 为什么其中一个会导致溢出? 什么定义了减法溢出。 假设系统使用2的补码和32位的整数表示

C ++按位运算

我正在操作两个整数的单个位,(我在Ubuntu机器上使用g ++进行编译)。 在某个中间步骤中,我有位表示 q = 11000000000000000000000000000000 q_1 = 00000000000000000000000000000001 现在我想检查单位q和q_1的位置是否相同。 所以,我在if条件下检查(*q)&1==q_1 ,并且它正常工作。 但每当我想检查单位的q位置是0而q_1的位置是1时,我认为我应该做((*q)&1==0) && (q_1==1) ,但它没有成功预期。 为了调试,我分别编辑了((*q)&1==0)和(q_1==1)并将它们打印为1 。 但是, ((*q)&1==0) && (q_1==1)打印为0.为什么? * 编辑:*在函数中,q通过引用传递,所以我使用* q来获取值..

Arduino中不需要的符号扩展

我试图在Arduino中实现逻辑右移(即避免符号扩展),并在阅读Arduino BitShift指南( https://www.arduino.cc/en/Reference/Bitshift )后,它建议将无符号变量转换为对,不会导致签名延期: 当您将x向右移位y位(x >> y),并且x中的最高位为1时,行为取决于x的确切数据类型。 如果x是int类型,则最高位是符号位,确定x是否为负,如上所述。 在这种情况下,由于历史原因,符号位被复制到较低位: int x = -16; // binary: 1111111111110000 int y = x >> 3; // binary: 1111111111111110 This behavior, called sign extension, is often not the behavior you want. Instead, you may 希望零从左侧移入。 事实certificate,对于unsigned int表达式,右移规则是不同的,因此您可以使用类型转换来抑制从左侧复制的规则。 在我的测试中,它不能像那样工作: Serial.print( ((uint32_t)(1<> 15, BIN); 打印: 11111111111111111 这意味着,标志扩展正在进行中。 我也从那里尝试了建议的例子,结果相同。 难道我做错了什么? 是否可以进行移位并强制操作是逻辑而不是算术?

类似位运算符之间的差异

在引用逐位运算符时,有什么区别! 和〜? 我觉得他们都翻了一下,但是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 […]

二进制打印在C中不起作用

我正在尝试使用c中的32位位掩码打印二进制文件,但二进制表示不会在if语句中打印出来。 unsigned int bit_mask = 2147483648; int decimal = 2; printf(“\nBinary representation of 2: \n”); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf(“0”); else printf(“1”); bit_mask = bit_mask >> 1; } decimal = 255; printf(“\n\nBinary representation of 255: \n”); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf(“0”); else printf(“1”); bit_mask = bit_mask >> […]

c中的位移乘法不使用2的幂

如何使用位移执行乘法36? 是不是只能乘以2的幂? 例如: unsigned x = 4; // binary 00000000 00000000 00000000 00001000 unsigned y = x << 3; // multiply by 8, resulting in binary 00000000 … 00100000 谢谢!

如何将int与分数相乘

我需要使用按位运算符将int乘以分数而不使用循环等。 例如,我需要将x乘以3/8。 我以为你会: int value = (x <> 3); // Divide by 8 但那不起作用。 我尝试使用谷歌搜索二进制时间分数,但这给出了浮点示例。 我不确切地知道这个作业是否适用于浮点数但是我的预感不是让我为此做好准备。 那有什么建议吗? 我需要向零舍入所以任何建议? 这不适用于数字-268435457。

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