【问题标题】:Reading individual bits from Memory从内存中读取单个位
【发布时间】: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还是0n &amp; (1 &lt;&lt; i)

标签: c++ pointers memory


【解决方案1】:

如果您真的担心移位成本太高(仅在某些较旧的 CPU 上确实如此,例如 68008),您可以像这样使用常量位掩码:

const unsigned int table [] = {0x00000001, 0x00000002, 0x00000004, 0x00000008,
                               0x00000010, 0x00000020, 0x00000040, 0x00000080,
                               // ...rinse and repeat until bit 31....
                              };

int isSet (unsigned int value, int bitNo) {
   return ((value & table [bitNo]) != 0);
}

出于无数原因,您上面显示的内容无法正常工作,其中一些在您收到的 cmets 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2013-04-20
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2017-12-03
    • 2018-05-10
    • 2012-04-11
    相关资源
    最近更新 更多