C中的Shift运算符

时间:2013-06-09 16:35:54

标签: c

我有一个长度为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功能,我想要移位运算符(&lt;&lt;&lt;&gt;)来提高效率。 我怎样才能做到这一点?

3 个答案:

答案 0 :(得分: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的类型匹配。

答案 1 :(得分:0)

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

B=(long long)(B+A[i]*(1ULL<<(63-i)));

答案 2 :(得分:0)

我知道这已经有了一个很好的答案,但这是另一个版本。我个人使用这个在c中实现的垂直计数器的一部分。通过首先将A [radix]设置为bool,可确保将任何非零值解释为单个位。仅供垂直柜台参考,如果有人感兴趣... 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;
}