-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);

  } 

結果はOKです。しかし、 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;
} 

ノート:

  • の型はBunsigned に変更されました。特にuint64_t、オーバーフローを避けるためです。
  • uint64_tunsigned 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] を 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;
} 
于 2013-06-09T18:03:08.097 に答える