我有一个长度为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;)来提高效率。 我怎样才能做到这一点?
答案 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;
}