Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で数値のビットを回転させるプログラムの書き方【左回転・右回転】

指定された数値のビットを回転させるCプログラムを作成するには、あらかじめ以下のポイントを考慮しておく必要があります。

  • ビットを左から右、または右から左のいずれかの方向に回転させます。
  • 左回転では、各ビットが左方向へ1ビットずつシフトされ、はみ出した最上位ビット(MSB)が最下位ビット(LSB)側へ移動します。
  • 右回転では、各ビットが右方向へ1ビットずつシフトされ、はみ出した最下位ビット(LSB)が最上位ビット(MSB)側へ移動します。
  • 対象となる数値を用意し、プログラムの仕様に応じて左回転・右回転のいずれかを実行します。
  • ユーザーは実行時に、回転させる回数とともに対象の数値を入力します。

プログラム1:左回転

以下は、指定された数値に対して左回転を実行するCプログラムです。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int number, rotate, Msb, size;
    printf("Enter any number:");
    scanf("%d",&number);
    printf("Enter number of rotations:\n");
    scanf("%d",&rotate);
    size = sizeof(int) * 8;
    rotate %= size;
    while(rotate--){
        Msb = (number >> size) & 1;
        number = (number << 1) | Msb;
    }
    printf("After Left rotation the value is = %d\n",number);
    return 0;
}

このプログラムでは、sizeof(int) * 8でint型のビット幅(一般的な環境では32ビット)を取得し、rotate %= sizeによって回転回数をビット幅の範囲内に正規化しています。ループ内では最上位ビットを取り出して変数Msbに退避し、数値を1ビット左へシフトした後、退避しておいたビットを最下位ビットとしてOR結合することで、循環する左回転を実現しています。

実行結果1

上記のプログラムを実行すると、次のような結果が出力されます。

Enter any number:12
Enter number of rotations:
2
After Left rotation the value is = 48

この例では、入力した12(2進数で「1100」)を2回左回転すると、48(2進数で「110000」)になります。

プログラム2:右回転

続いて、指定された数値に対して右回転を実行するCプログラムを紹介します。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int number,rotate, Lsb, size;
    printf("Enter any number:");
    scanf("%d",&number);
    printf("Enter number of rotations:\n");
    scanf("%d",&rotate);
    size = sizeof(int) * 8;
    rotate %= size;
    while(rotate--){
        Lsb = number & 1;
        number = (number >> 1) &(~(1<<size));
        number=number|(Lsb<<size);
    }
    printf("After right rotation the value is = %d\n",number);
    return 0;
}

こちらのプログラムでは、最下位ビットを変数Lsbに退避させてから数値を1ビット右へシフトし、退避しておいたビットを最上位ビット側へ戻すことで、循環する右回転を行っています。

実行結果2

上記のプログラムを実行すると、次のような結果が出力されます。

Enter any number:18
Enter number of rotations:
2
After right rotation the value is = 4

この例では、入力した18(2進数で「10010」)を2回右回転すると、4(2進数で「100」)になります。

  1. 三角マッチ棒数を求めるC/C++プログラムの解説と実装例

    三角マッチ棒数とはマッチ棒を正三角形の形に並べて作った三角形のことを「三角マッチ棒数(Triangular Matchstick Number)」と呼びます。三角マッチ棒数とは、そのマッチ棒の三角形を作るために必要なマッチ棒の本数を指します。問題の概要この問題では、マッチ棒で作るピラミッドの段数 X が与えられます。そして、X 段のマッチ棒ピラミッドを構成するために必要なマッチ棒の最小総本数を出力するプログラムを作成するのが課題です。概念をより明確にするために、具体例を見てみましょう。入力: 7 出力: 84解法の考え方この問題は、三角数(Triangular Number)の拡張として考える

  2. Pythonで指定した数がディサリウム数(Disarium Number)かどうかを判定する方法

    ある整数がディサリウム数(Disarium Number)であるかどうかを判定するには、各桁の数字を「その桁の位置」でべき乗し、それらを合計した値が元の数と一致するかを確認します。計算の前に、まず対象の数が何桁であるかを求めておく必要があります。 ディサリウム数とは? ディサリウム数とは、各桁の数字をそれぞれの位置(左から1桁目は1乗、2桁目は2乗…)でべき乗した合計が、元の数そのものと等しくなる数のことです。 例えば 135 は次のように計算できます。 135 = 1¹ + 3² + 5³ = 1 + 9 + 125 = 135 このように合計が元の数と一致するため、135 はディサリウム数