- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在参加 Coursera 上的硬件/软件接口(interface)类(class),我相信您已经从那里看到了很多这样的问题..
其中一项作业是确定 2 的补码整数 x 是否可以放入 n 位,仅使用运算符的子集等。我做得很好,但遇到了 2 种不同的方法,并用它们敲击了白板两者都充分理解它们。然后是困惑。
如果可能适合,函数返回 1,否则返回 0。
int fooBar(int x, int n) {
return !(((x << (32-n)) >> (32-n)) ^x);
}
以正整数执行
fooBar(5,3) == 0
正确计算出 5 不能表示为 2 的补码 3 位整数。
以负整数执行
fooBar(-4,3) == 1
正确计算出 -4 可以表示为 2 的补码 3 位整数。
方法一分析
x=5, n=3
00000000000000000000000000011101 32 - n == 29
10100000000000000000000000000000 x<<29
00000000000000000000000000000101 >> 29
00000000000000000000000000000101 5
XOR
00000000000000000000000000000101 5
--------------------------------
00000000000000000000000000000000 0
00000000000000000000000000000001 !0 == answer, 1.
如您所见,这将返回 0,因为 5 不能表示为 3 位以内的 2 的补码整数。
int fooBar(int x, int n) {
return !((x & ~(1 << (32-n))) ^x);
}
以正整数执行
fooBar(5,3) == 1
误报。
以负整数执行
fooBar(-4,3) == 0
假阴性。
方法二分析
x=5, n=3
00000000000000000000000000011101 32 - n == 29
11011111111111111111111111111111 ~(1<<29)
AND
00000000000000000000000000000101 5
--------------------------------
00000000000000000000000000000101 5
00000000000000000000000000000101 5
XOR
00000000000000000000000000000101 5
--------------------------------
00000000000000000000000000000000 0
00000000000000000000000000000001 !0 == answer, 1.
我正在编译:
gcc version 4.7.2 (Debian 4.7.2-5)
问题
我不知道如何解释输出的差异,因为分析表明在位级别上一切都是相同的,所以任何关于我可以从哪里弄清楚这一点的提示/技巧都是非常重要的赞赏。
感谢您的宝贵时间!
科学。
最佳答案
在方法一中,你写
10100000000000000000000000000000 x<<29
00000000000000000000000000000101 >> 29
但这不正确(请注意,您的分析意味着 fooBar(5,3) == 1
)。
首先,5 << 29
的结果导致有符号 32 位(或更小)溢出 int
s,这是未定义的行为。
接下来,如果移位创建了指示的位模式(通常如此),结果将为负数。
右移负整数是实现定义的,常见的是算术右移,这将符号扩展,这里导致
11111111111111111111111111111101 >> 29
其中,当与 5 进行异或运算时给出非零结果(然后应用 !
产生 0)。
方法 2 根本不起作用,因为除了某些输入的未定义行为外,它所做的只是检查 (32-n)
是否存在。 - 第一位已设置。
关于c - 按位 : different behaviour with negative input value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16217142/
我有两个文本输入元素 A 和 B。 我希望用户能够从 A 中选择部分或全部文本并拖动到 B,但文本不会从 A 中消失。 假设“A”包含“quick brown fox”,用户突出显示“fox”一词并将
我正在一个网站上工作,如果在提交表单之前数字不在最小值和最大值之间,我希望数字输入能够自行更正。我的代码如下: HTML: JavaScript: function CorrectOverUnder
在检查输入值是否存在并将其分配给变量时,我看到了两种实现此目的的方法: if(Input::has('id')) { $id = Input::get('id'); // do som
我意识到 有一个 border-box盒子模型,而有一个 content-box盒子模型。此行为存在于 IE8 和 FF 中。不幸的是,这使我无法将这种样式应用于大小均匀的输入: input, tex
在 Polymer 文档 ( https://elements.polymer-project.org/elements/iron-input ) 中,我发现: 而在另一个官方文档(https://
我使用 jquery 添加/删除输入 我使用append为日期/收入添加多个Tr 我还使用另一个附加来添加多个 td 以获取同一日期 Tr 中的收入 我添加多个日期输入,并在此表中添加多个收入输入 我
Python3 的 input() 似乎在两次调用 input() 之间采用旧的 std 输入。有没有办法忽略旧输入,只接受新输入(在 input() 被调用之后)? import time a =
在一些教程中,我看到了这些选择器: $(':input'); 或 $('input'); 注意“:”。 有什么不同吗? 最佳答案 $('input') = 仅包含元素名称,仅选择 HTML 元素。 $
我有下一个 html 表单: Nombre: El nombre es obligatorio. Solo se pe
有两种方法可以在组件上定义输入: @Component({ inputs: ['displayEntriesCount'], ... }) export class MyTable i
input: dynamic input is missing dimensions in profile onnx2trt代码报错: import numpy as np import tensor
所以,我有允许两个输入的代码: a, b = input("Enter a command: ").split() if(a == 'hello'): print("Hi") elif(a =
我有一个与用户交流的程序。我正在使用 input() 从用户那里获取数据,但是,我想告诉用户,例如,如果用户输入脏话,我想打印 You are swearing!立即删除它! 而 用户正在输入。 如您
我在运行 J2ME 应用程序时遇到了一些严重的内存问题。 所以我建立了另一个步骤来清除巨大的输入字符串并处理它的数据并清除它。但直到我设置 input = null 而不是 input = "" 才解
我想在我的 android 虚拟设备中同时启用软输入和硬键盘。我知道如何两者兼得,但不会两者。 同时想要BOTH的原因: 软输入:预览当键盘缩小屏幕时布局如何调整大小 硬键盘:显然是快速输入。 提前致
我有一个邮政编码字段,在 keyup 上我执行了一个 ajax 调用。如果没有可用的邮政编码,那么我想添加类“input-invalid”。但问题是,在我单击输入字段的外部 某处之前,红色边框验证不会
根据我的理解使用 @Input() name: string; 并在组件装饰器中使用输入数组,如下所示 @Component({ ... inputs:
我有一段代码是这样的 @Component({ selector: 'control-messages', inputs: ['controlName: control'],
在@component中, @input 和@output 属性代表什么以及它们的用途是什么? 什么是指令,为什么我们必须把指令放在下面的结构中? directives:[CORE_DIRECTIVE
有没有一种方法可以测试变量是否会使SAS中的INPUT转换过程失败?或者,是否可以避免生成的“NOTE:无效参数”消息? data _null_; format test2 date9.; inp
我是一名优秀的程序员,十分优秀!