- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个简单的函数来测试两个数组是否互为逆数组。除了 tmp
变量外,它们看起来完全相同。一个有效,另一个无效。我一辈子都弄不明白为什么编译器会优化它——如果它确实是一个优化问题(我的编译器是 IAR Workbench v4.30.1)。这是我的代码:
// this works as expected
uint8 verifyInverseBuffer(uint8 *buf, uint8 *bufi, uint32 len)
{
uint8 tmp;
for (uint32 i = 0; i < len; i++)
{
tmp = ~bufi[i];
if (buf[i] != tmp)
{
return 0;
}
}
return 1;
}
// this does NOT work as expected (I only removed the tmp!)
uint8 verifyInverseBuffer(uint8 *buf, uint8 *bufi, uint32 len)
{
for (uint32 i = 0; i < len; i++)
{
if (buf[i] != (~bufi[i]))
{
return 0;
}
}
return 1;
}
代码的第一个版本有效,第二个版本无效。谁能弄清楚为什么?或者进行一些测试来探测问题出在哪里?
最佳答案
您看到的情况是整数提升 规则的结果。任何时候在表达式中使用小于 int
的变量,该值都会被提升为 int
类型。
假设 bufi[i]
包含值 255。它的十六进制表示是 0xFF
。然后,该值是 ~
运算符的操作数。因此,该值将首先被提升为 int
(假设它是 32 位)将具有值 0x000000FF
,并将 ~
应用于此给出你 0xFFFFFF00
。然后将此值与类型为 uint8_t
的 buf[i]
进行比较。值 0xFFFFFF00
超出此范围,因此比较始终为假。
如果您将 ~
的结果分配回 uint8_t
类型的变量,值 0xFFFFFF00
将转换为 0x00
。然后将此转换后的值与 buf[i]
进行比较。
所以你看到的行为不是优化的结果,而是语言的规则。按原样使用临时变量是解决此问题的一种方法。您还可以将结果转换为 uint8
:
if(buf[i] != (uint8)(~bufi[i]))
或者屏蔽掉除最低位字节以外的所有字节:
if(buf[i] != (~bufi[i] & 0xff))
关于c++ - bitwise not操作的编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57823023/
我在一个项目中有几行代码,我看不到...的值(value) buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80); 它从文件中读取文件缓冲区,
为了调试目的,我在头文件中有以下程序代码。我的意图是在编译期间决定哪些消息应该打印到控制台端口,或者如果程序不是在 Debug模式下编译则根本不打印它们。 #define ALL 0xffffffff
这个问题看似重复,但实际上并非如此。我想知道如何将负数 (base-10) 转换为 32 位数字 (base-2)。例如base-10 中的 -9 相当于 base-2 中的 111111111111
如果只有AND和OR运算,如何进行XOR按位运算? 最佳答案 创建我自己的脚本语言-ChrisScript-您只需要以下内容: #!/bin/chrish bit XOR (bit A, bit B)
为什么按位非运算符(在大多数语言中为 ~)像这样转换以下值: -2 -> 1-1 -> 00 -> -11 -> -2 不应该-2转换为 2 , 1转换为 -1 , 等等。? 最佳答案 见 two's
如何使用按位运算符将两个整数相乘? 我找到了一个实现 here .有没有更好的方法来实现乘法? 例如:2 * 6 = 12 必须使用按位运算符执行。 注意:数字是任意的,不是 2 的幂 最佳答案 #i
我面临着一个相当奇怪的问题。我正在为不支持按位运算的体系结构开发编译器。然而,它处理带符号的 16 位整数算术,我想知道是否可以仅使用以下内容来实现按位运算: 加法 (c = a + b) 减法(c
遇到这样一道编程面试题。但对我来说,你怎么知道可以在这里使用位移位并不明显。好心人解释一下。谢谢。 数组的大小为 N,整数介于 0 和 1024 之间(允许重复)。另一个整数数组的大小为 M,对数
在 Pharo 中,我想对整数进行位掩码,在 Python 中如下所示: ((b1 & 0x3F) > 4) 我知道 & 和 | 在 Pharo 中工作,但我很确定它们不是按位的。 最佳答案 但你错了
if (!(y&1)) { c[x++]=d[--y]; } 我无法理解这个声明的作用。 y 是一个 int 值。 非 (!) 符号代表什么? 最佳答案 ! 将 0 转
我想知道类型转换在实践中是如何在类型之间进行的(在“嵌入式”C 中)。例如:如果我有一个 Signed 16-bit 数字,值为 -80d,11010000b,我想将它转换为 无符号 16 位。我
这是我的问题: 我正在 QtCreator 中编写一个程序来读取一些电池数据(电压、电流等)。每个值都以两个字节的形式传递,我必须将它们组合成一个 UINT16。有时我的程序会正确并显示正确的值(大约
我有一个简单的函数来测试两个数组是否互为逆数组。除了 tmp 变量外,它们看起来完全相同。一个有效,另一个无效。我一辈子都弄不明白为什么编译器会优化它——如果它确实是一个优化问题(我的编译器是 IAR
我正在开发我的第一个应用程序,其中包含多个用户的权限和角色。我的理解是最好的方法是使用 BitWise 格式。这是真的吗,还是有更好的选择? 这是我当前的测试代码,我得到了一个相当奇怪的效果。如果有人
在这里让我自己有点困惑。 我想测试一组位(3 位)是否包含某个位置的位。 if (B110 & B010 == B010) (B110 是要检查的数字,B010 是我想看看有没有的位) 上面的代码没有
我正在尝试将代码从 C 转换为 Lua,但遇到了问题。 如何在 Lua 中翻译按位与? 源 C 代码包含: if ((command&0x80)==0) ... 这怎么能在Lua中完成? 我正在
给定两个数字 L & R ,查找 L 和 R 之间的所有数字的按位与 约束 1<= L,R <= (2^32) . LL step = 1; while(L!=R) {
我完全期待投票,但这让我非常好奇,我希望至少有人能回答。我们的离散数学教授真的很喜欢旧语言,因为它们提供了大量的按位运算符。现在,他给了我们一个作业来确定以下 BASIC 语句的输出: PRINT (
我正在尝试实现以下部分中的功能:Per-commitment Secret Requirements . generate_from_seed(seed, I): P = seed f
A) int a[][]=new int[20][32]; a[2][3]=1; if(a[2][3]==1) { System.out.println("true");
我是一名优秀的程序员,十分优秀!