【发布时间】:2016-10-04 12:34:29
【问题描述】:
为了将一个以 10 为底的数字转换为以 2 为底的数字,我想到了直接从内存中读取位而不是执行位移 (>>)。
考虑程序:
int n = 14;
bool* pointer = (bool*)&n;
for(int i = 0; i < 32; i++)
cout << *(p + i);
程序没有给出正确的输出。
下面的程序有效:
int n = 14;
bool *p = (bool*)&n;
for(int i = 0; i < 32; i++){
cout << *p;
n = n >> 1;
}
位移会浪费不必要的时间。另外请指出第一个代码sn-p中的错误。
【问题讨论】:
-
"位移会浪费不必要的时间。" - 你有什么问题?表现?你是如何描述或基准的?你期待什么?什么是汇编代码?为什么你期望
int有 32 位?为什么是 32 位的bool?您的实现对右移有符号整数有何看法? -
你似乎认为
sizeof bool == 32 / 8- 这是错误的。 -
如果您认为位移是浪费时间,那么您可能从未阅读过您的处理器手册。
-
bool一点也不。没有办法解决单个位。 -
如果要从内存中读取位,可以循环检查
ith位是1还是0为n & (1 << i)