-2

我有一个长度为 64 的二进制数组。我想在 C 中找到相应的整数。我编写了以下代码。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
main()
 {

      int A[64]={1, 1, 1, 1, 1,1, 1, 1, 1, 1,1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1,1,1,1},i;


       long long  int B=0;

      for(i=0;i<64;i++)
             B=B+A[i]*pow(2,63-i);

      printf("B=%llu\n",B);

  } 

结果没问题。但是为了提高效率,我想要移位运算符 (<<) 而不是 pow 函数。我怎样才能做到这一点?

4

3 回答 3

5
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>

int main(void)
{
    int A[64] = {
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
    };

    uint64_t B = 0;

    for (int i = 0; i < 64; ++i)
        B |= (uint64_t) A[i] << 63-i;

    printf("B = %" PRIu64 ".\n", B);

    return 0;
} 

笔记:

  • 的类型B已更改为无符号,特别是uint64_t为了避免溢出。
  • uint64_t被使用,而不是unsigned long long为了意思的清晰和精确。
  • 中的格式说明符printf与 的类型匹配B
于 2013-06-09T17:43:58.833 回答
0
B=B+A[i]*pow(2,63-i);

B=(long long)(B+A[i]*(1ULL<<(63-i)));
于 2013-06-09T16:54:17.853 回答
0

我知道这已经有一个很好的答案,但这是另一个版本。我个人将其用作在 c 中实现的垂直计数器的一部分。通过首先将 A[radix] 设置为布尔值,它确保任何非零值都将被解释为单个位。如果有人感兴趣,仅供参考垂直计数器... http://www.steike.com/code/bits/vertical-counter/

#include <stdint.h>
#include <stdio.h>

int main( int argc, char *argv[]) {
    int A[64] = {
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
    };

    uint64_t B = 0;

    for (int radix = 63; radix >= 0; radix--)
        B |= ((uint64_t)(A[radix]))<<radix;

    printf("B = %llu\n", B);
    return 0;
} 
于 2013-06-09T18:03:08.097 回答