- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 C 学习位操作。我在编写将二进制转换为十进制的程序时遇到了问题,特别是在程序的 for 循环中。以下是我的代码:
unsigned int binary_to_uint(const char *b)
{
unsigned int result = 0;
int i, len;
if (!b)
return (0);
len = strlen(b);
for (i = 0; i < len; i++)
{
if (b[i] == '1')
{
result += 2 << (i-1); /*where my issue is*/
}
else if (b[i] == '0')
continue;
else
return (0);
}
return (9);
}
我试过调试,我意识到我的问题源于 if 语句
因此,我对 if* 语句中的代码做了一些实验:
int main() {
// Write C code here
int i = 0;
printf("result of 2 << (%d - 1): %d\n", i, 2 << (i - 1));
printf("result of 2 << (0 - 1): %d", 2 << (0 - 1));
return 0;
}
在第一个 printf 中,在控制台中显示 result of 2 << (0 - 1): 0,而在第二个 printf 中,在控制台中显示 result of 2 << (0 - 1): 1。我的期望是两个 printf 应该显示完全相同的东西,即 2 << -1 的值是 1,但事实并非如此。有人可以帮我理解发生了什么事吗?为什么使用变量 i 将移位运算符的结果更改为 0?
最佳答案
<<
的右侧操作数或 >>
运算符必须是非负的。对此操作数使用负值会触发 undefined behavior .因此,您不能使用负值向相反方向移动。
这在 C standard 的第 6.5.7p3 节中有详细说明。 :
The integer promotions are performed on each of the operands. The typeof the result is that of the promoted left operand. If the value ofthe right operand is negative or is greater than or equal to the widthof the promoted left operand, the behavior is undefined.
在您的特定情况下,未定义的行为表现为使用 i-1
之间的不同结果。和 0-1
为正确的操作数。
而不是转移 2
通过 i-1
地方,而不是转移 1
通过 i
地点:
result += 1 << i;
关于c - 与左移运算符 (<<) 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74293486/
所以我正在阅读“Java:初学者指南”并且有这样的代码: class ShowBits{ int numbits; ShowBits(int n){ numbits =
我一直在调试 C++ 库中的问题,发现文字 0 和变量设置为 0 之间存在奇怪的差异,但仅在库内部。如果我将代码复制到我自己的代码中,它就会按预期工作。 库代码将 1 向下移动一个长整数,以一次屏蔽一
这个问题已经有答案了: Is left and right shifting negative integers defined behavior? (3 个回答) 已关闭 5 年前。 在解决问题时,
我想将 num 与 scale 参数相乘。这里 num 和 scale 是 float 变量。我打算使用左移 >运算符必须是整数类型。 C11:6.5 表达式(p4): Some operators
假设我有一个二进制数。 1010 是十进制的 10。 我理解左移1位本质上是数字乘以2。 教科书中有一句话让我感到困惑。 salq %cl, %rdx %rdx 是一个数字,%salq 是一个左移。我
假设我有一个二进制数。 1010 是十进制的 10。 我理解左移1位本质上是数字乘以2。 教科书中有一句话让我感到困惑。 salq %cl, %rdx %rdx 是一个数字,%salq 是一个左移。我
在这个等式中 #define mod 1000000007 int n; int num = ((1<
我必须编写一个函数来接收 像10001这样的二进制数, 和 一个十进制数,表示我应该轮类多少次。 问题是,如果我使用 C++ 运算符 << ,从后面推零,但不会丢弃第一个数字......例如 shif
标题总结如下:左移 uint64_t 不会输出预期值,我想知道为什么。我得到的是预期结果,其 4 个最高有效字节被清零。我在 Debian Jessie 64 位上使用 x86_64 CPU(Inte
System.out.println((-1<<31)); 为什么输出 -2147483648 我知道 -1<<31 会给出 10000000000000000000000000000000,所以它应
谁能解释为什么下面的代码不能编译? byte b = 255 << 1 错误: Constant value '510' cannot be converted to a 'byte' 我期待以下二进
考虑: int a = 0; a |= 1 << a; System.out.println(a); 它打印“1”。为什么?我认为向左位移 0 任意次数仍然是 0。它从哪里拉出 1?
下面是否未定义,为什么? int i = 0xFF; unsigned int r = i << 24; 最佳答案 除非int,否则该行为在技术上是未定义的类型超过 32 位。 来自 C++11,5.
我的应用由全屏 UIWebView 提供支持。它运行良好,除非调出键盘时 View 移动了大约 10 个像素,留下一个白色间隙(请参见下面的屏幕截图)。 有谁知道造成这种情况的原因以及是否有任何解决方
有人可以解释一下 Golang 中的左移/右移行为吗?请在此处引用示例代码:https://play.golang.org/p/7vjwCbOEkw package main import (
如何让 Emacs 使用 ShiftTab 将所选文本向左移动 4 个空格? 最佳答案 为此,我使用命令indent-rigidly,绑定(bind)到C-x TAB。为其指定参数 -4,将所选区域向
这个问题已经有答案了: Remove First 16 Bytes? (4 个回答) 已关闭 8 年前。 我有一个 3 字节的字节数组:byte[] VG = new Byte[3]; 这是数组的值:
假设我有一个类,我想为其重载一个基于枚举类型的运算符: #include enum class option : char { normal, do_something_stupid }; clas
我正在尝试执行以下操作。但是我不确定我可能哪里出错了 uint64_t x = (1 = width of type [-Wshift-count-overflow] 我得到输出 0。我期待像这样的二
我正在摆弄一个 Flappy Bird 的克隆,我无法弄清楚以下代码的含义 let birdCategory: UInt32 = 1 << 0 let worldCategory: UInt32 =
我是一名优秀的程序员,十分优秀!