2016-10-23 3 views
1

私はプログラムを動作させようとしています。ここでは、ビットを左にシフトし、シフトしたビットを右に追加します。たとえば00111000のように、4つの位置を左にシフトすると、結果は10000011になります。どのように私はこの作品を作ることができる、私はビットORを使用する必要があることを知っている。私は以下の主な機能を追加しました。ビットを左に回転し、回転したビットを右に追加する方法

#include <stdio.h> 
#include <stdlib.h> 

void printbits(int b){ 
    int i; 
    int s = 8 * (sizeof b) - 1; /* 31 if int is 32 bits */ 
    for(i=s;i>=0;i--) 
    putchar(b & 1<<i ? '1' : '0'); 
} 



int main(){ 
    char dir; /* L=left R=right */ 
    int val, n, i; 

    scanf("%d %d %c",&val, &n, &dir); 
    printbits(val);putchar('\n'); 
    for (i=0; i<10; i++){ 
    if (dir=='L' || dir =='l') 
     rotateLeft(&val, n); 
    else 
     rotateRight(&val,n);  
    printbits(val); putchar('\n'); 
    } 
return; 
} 

これはrotateLeftとrotateRight関数です。 1ビットnのビット回転を左

#include <stdio.h> 
#include <stdlib.h> 

void rotateLeft(int *val, int N){ 
    int num = val[0]; 
    int pos = N; 

    int result = num << pos; 


} 

void rotateRight(int *val, int N){ 
    int num = val[0]; 
    int pos = N; 

    int result = num >> pos; 


} 
+0

「右にシフトされたビットを追加する」とはどういう意味ですか?左右にシフトして合計しますか? –

+0

[同様の質問](http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c)。署名された 'int'のサインビットでビットを投げ捨てるならば、あなたは懐中電灯を使わずにピッチ黒の崖の端を歩いていることに注意してください。 – WhozCraig

+0

@BenceKaulics左の4つの位置に移動すると、その1が右に追加されます。私は説明が難しいです。ごめんなさい:S – Sullivan

答えて

0

は、ソースコードを完了するためにテストされ、非最適化されたソリューションです:

void rotateLeft(int *val, int N){ 
    unsigned int num = val[0]; 
    int pos = N; 

    unsigned int part1 = num << pos; 
    unsigned int part2 = (num >> ((sizeof(val[0])*CHAR_BIT)-pos)); 

    if (N != 0) { 
     val[0] = part1 | part2; 
    } 
} 

void rotateRight(int *val, int N){ 
    unsigned int num = val[0]; 
    int pos = N; 

    unsigned int part1 = num >> pos; 
    unsigned int part2 = (num << ((sizeof(val[0])*CHAR_BIT)-pos)); 

    if (N != 0) { 
     val[0] = part1 | part2; 
    } 
} 

ないようにするにはシフト右の間に自動的にキャリー、あなたは unsigned intとして値を考慮する必要があります。

N = 0の干渉を防ぐには、(N!= 0)の場合にのみ結果をエントリに割り当てます。 (ROL/ROR on variable using inline assembly in Objective-Cのコメントを参照してください)

+0

ありがとうございました! – Sullivan

+0

@piquardこの部分は何をしていますか? if(N≠0){ val [0] = part1 |パート2; – Sullivan

+0

@Sullivan入力の値は、RORまたはROLが注文されたときにのみ更新されます(N!= 0を意味します)。注意:Nの負の値は逆の操作を行うため、2つの関数をマージできます。 –

0
MSB = (n >> (NUM_OF_BITS_IN_INT - 1)) 
n = (n << 1) | MSB; 

あなたはMSBを肩をすくめていますが、には、をLSBの位置に戻していません。

+0

お返事ありがとうございます、MSBは何ですか? – Sullivan

+1

MSB:最上位ビット。 LSB:最下位ビット。したがって、MSBとLSBはそれぞれ左端と右端のビットです。 –

関連する問題