- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
int bitcheck(int test){
int result = 0, unit = 0, i;
for (i = 0; i < 8; i++){
unit = test >> i & 1;
result |= unit << (8 - i - 1) + result;
}
return result;
}
假设测试 = 77 (0100 1101)
当 i = 2 时,单位将等于 1,结果将(在“结果 |=..”之前)等于 128。所以 1 << 133(在计算“结果 | 结果”之前)是 0010 0000 ? (我打印了每一步),但如果我自己做 1<<133 结果是 0000 0000?
我知道为什么 1<<133 的结果是 0000 0000,但为什么在 for 循环中不一样?
test is: 01001101
unit when i is 0: 00000001
00000001<<00000111 = 10000000
result when i is 0: 10000000
unit when i is 1: 00000000
00000000<<10000110 = 00000000
result when i is 1: 10000000
unit when i is 2: 00000001
00000001<<10000101 = 00100000
result when i is 2: 10100000
unit when i is 3: 00000001
00000001<<10100100 = 00010000
result when i is 3: 10110000
unit when i is 4: 00000000
00000000<<10110011 = 00000000
result when i is 4: 10110000
unit when i is 5: 00000000
00000000<<10110010 = 00000000
result when i is 5: 10110000
unit when i is 6: 00000001
00000001<<10110001 = 00000000
result when i is 6: 10110000
unit when i is 7: 00000000
00000000<<10110000 = 00000000
result when i is 7: 10110000
return result: 10110000
最佳答案
正如其他人所指出的,这是 undefined behavior ,这意味着如果您只需要遵循 C 标准,那么理论上任何事情都可能发生。
不过,我认为这对您的问题有点无益,因为您会想知道为什么对相同的两个数字进行相同的操作会产生不同的结果。毕竟,虽然 C 标准没有指定结果是什么,但 CPU 本身确实遵循其自己的位移指令工作方式规范,并且不太可能涉及生成随机结果。
您看到的差异很可能是由于 CPU 的移位实现与编译器在预计算编译时已知结果时使用的实现之间的差异。例如考虑这个简单的例子:
$ cat shift.c
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
int main(int argc, char ** argv)
{
uint32_t a = atoi(argv[1]), b = atoi(argv[2]), c, d;
c = a << b;
d = 1u << 133u;
printf("%08x << %08x = %08x\n",a,b,c);
printf("%08x << %08x = %08x\n",1,133,d);
return 0;
}
$ gcc -o shift{,.c}
shift.c: In function ‘main’:
shift.c:9:2: warning: left shift count >= width of type
$ ./shift 1 133
00000001 << 00000085 = 00000020
00000001 << 00000085 = 00000000
这是在 Intel Core2 Duo cpu 上运行的。看似相同的操作在这里执行了两次却得到了不同的结果。但是这两个操作实际上并不等同。第一个涉及编译器不知道其值的数字,因此它们被简单地编译成一条 sall
x86 指令。本说明书only uses the lowest 5 bits of the count . 133 (0x85) 的最低 5 位是 5,因此实际执行的位移是 1 << 5 = 32 (0x20),这与输出匹配。所以这是有道理的。
但是另一条线发生了什么?这里编译器知道两个操作数是什么,所以它可以预先计算结果并存储它。没有生成 sall
指令。 gcc 的位移位实现(仅当结果可以在编译时计算时才起作用)处理太大计数的方式与 sall
不同。在这种情况下,有效地使用了整个计数,并且所有位都被移走了。
总结一下:
关于c - 按位 c - 在 for 循环内不同的结果(不知道如何放置更好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224205/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!