2014-01-25 1 views
0
// 1.5 Exercise 6.cpp : main project file. 

#include "stdafx.h" 
#include <stdio.h> 

int sra(int x, int n); 

int main() 
{ 
    int intInputNum; 

    int finalValue1; 
    int finalValue2; 

    printf("Please enter a integer and program will shift the integer 2 places to right,\n it will give value for both arithmetic as well as Logical shift\n"); 
    scanf("%d",&intInputNum); 

    finalValue1 = intInputNum >> 2; 

    finalValue2 = sra(intInputNum, 2); 

    printf("Logical %d \n Arithmetic %d\n", finalValue1, finalValue2); 

    return 0; 
} 


int sra(int x, int k) 
{ 
    int xsrl = (unsigned)x >> k; 
    unsigned mask = k ? ((1 << (8 * sizeof(int)-k)) - 1) : 0; 
    return (x < 0) ? mask | xsrl : xsrl; 
} 

샘플 실행 : 음수 num 입력에서 산술 Shift가 작동하지 않습니까? 내가 여기서 뭘 잘못하고 있는거야?

 
Please enter a integer and program will shift the integer 2 places to right, 
it will give value for both arithmetic as well as Logical shift 
-500 

Logical -125 
Arithmetic 1073741823 

왜이 올바른 값을 표시되지?

+1

부호있는 숫자를 이동하는 것은 좋은 생각이 아닙니다. –

+0

아마도 :하지만 그건 위의 질문이 아니 었습니다. 문제는 "sra"가 작동하지 않는 이유입니다 (부호없는 숫자 만 사용함). –

답변

0
unsigned mask = k ? ((1 << (8 * sizeof(int)-k)) - 1) : 0; 

나는 이것이 당신이 원하는 것일 수 없다고 생각합니다. 예 (K == 1) : 마스크 = 0x7FFFFFFF

다음

사용 "마스크 | xsrl" "0x7FFFFFFF는"제공 (는 OR 연산의 ...)

그냥 큰소리로 생각 : 나는 당신을 생각

unsigned mask = k ? (0xFFFFFFFF<<(32-k)) : 0; 

정말 정확하게 할 수 있습니다 :

unsigned int mask = 0; 
if (k > 0 && k <= (8*sizeof(int))) 
    mask = UINT_MAX<<((8*sizeof(int))-k); 

당신은 "UINT_MAX"을 얻기 위해 "limits.h"를 포함해야합니다.

+0

도움에 감사드립니다. 귀하의 조언은 효과가있었습니다 !!! – PreMfe

1

이 표준은 아무것도을 부정 왼쪽 사이드 (좌) 인수에 시프트 작업 (이 중 하나 << 경우 또는 (당신의) >> 경우 정의 구현에서 정의되지 않은 행동이다) 보증하지 않습니다.

+0

완전히 수정되지 않았습니다. LHS에 음수를 갖는'>>'은 구현에 따라 정의됩니다. – nhahtdh

+0

저에게서 어리석은 질문 : LHS는 무엇입니까? –

+0

@nhahtdh 맞아요, 그에 따라 답을 수정했습니다. –