首要问题的答案让值班员搞错了
Top question`s answer gets shift operator wrong?
在以下问题中:为什么处理已排序的数组比处理未排序的数组快?接受的答案解释了避免给定示例的分支预测的方法。他/她继续用一些按位运算符替换条件语句:
替换:
if (data[c] >= 128) sum += data[c];
带有:
int t = (data[c] - 128) >> 31; sum += ~t & data[c];
然而,在他向右移动的行中,他似乎是在对一个潜在的有符号值进行移动,根据这个:
如果移位运算符后的值大于左侧操作数中的位,则结果未定义。如果左边的操作数是无符号的,右边的移位是逻辑移位,所以高位将用零填充。如果左侧操作数为右移可以是也可以不是逻辑移位(即,行为是未定义的(。
是未定义的行为。有人能澄清我是否遗漏了他正在执行的逐位操作的一些内容吗?也可以用外行的术语解释所执行的逐位数操作的意图(假设我们将其解释为符号值移位的某些定义中定义的行为(。
如果data[c] >= 128
,那么data[c] - 128
将是非负的,所以它的符号位将是0
。否则,如果data[c] < 128
,则data[c] - 128
将为负,因此其符号位将为1
。
如果我们右移31(假设int
是32位,并且右移是算术的,所以定义了是的实现,但很常见(,那么当data[c] >= 128
时,我们将具有0x00000000
,当data[c] < 128
时,我们具有0xffffffff
。
如果我们随后逐位反转该值,那么当data[c] >= 128
时我们将具有0xffffffff
,或者当data[c] < 128
时具有0x00000000
。
如果我们将该值与data[c]
进行位"与"运算,则当data[c] >= 128
时我们将具有data[c]
,当data[c] < 128
时我们将获得0x00000000
。
将0
添加到sum
没有任何作用,因此我们有效地只添加大于或等于128
的值,而不进行分支。
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 首要问题的答案让值班员搞错了
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 我的C++线程做错了什么?
- 如何正确使用 >=?(a+f()+c)>=0 错了吗?
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- 没有输出的合并排序我做错了什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?
- 指针相关的UE4崩溃.我的指针哪里错了?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- FFMPEG,C++,内存泄漏,我做错了什么?
- 我做错了什么?反向字符串 C++
- 我在这个课上做错了什么?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 理解C++内存顺序,我错了吗?