2013-08-28 3 views
0

가 나는 나눗셈 (/)와 모듈 (%)를 사용하지 않고 2 10에서 염기를 변환하는 질문에 부여 된, 그래서 비트 AND (&)을 이용하여 용액과 오른쪽 해낸 shift (>>) 연산자.진수 부는 좌측 시프트

그래서이 두 연산자가 정확히 무엇을하는지 배우기 시작하지만 몇 가지 질문에 대해서는 대답을 찾지 못하거나 논리를 이해할 수 없습니다.

십진법 및 이진법 모두에서 숫자 자리 값에 따라 구분이 올바르게 작동하는 것으로 알고 있습니다. 우리가 숫자를 10 또는 2로 나눌 때 두 자리 모두에서 자리 값을 한 자리 씩 이동합니다. 그러면 10 진수로 10으로 나누고 2 진수로 2로 나누어집니다.

X = 120 X >> 1 우리 X = 12 (10 의한 분할)를 사용할 경우에 (10베이스)

Y = 1000

1 우리 >> 만약 Y (두 자료) X = 100 (2으로 나누기)

을 가지고 있지만 나는이 코드 조각을 사용하면됩니다

#include<iostream> 
using namespace std ; 

int main() 
{ 
    int a,b=1; 
    cout <<"enter an integer"<<endl; 
    cin>> a; 
    cout<<(a & b)<<endl; 
    a=a>>1; 
    cout<<a; 
    cout<<endl; 
    system("pause"); 
    return 0 ; 
} 

나는이

같았다 내 마음에 comfused 원인을 얻을

A = 120 (10베이스) X >> 1 우리는 X = 12 ( 10으로 나누는)

가되지만 결과이

A = 120이라면

F : 1 >> 만약 X (10베이스) 우리 I의 결과에 대한 두 가지 점을 이해하지 못하는 X = 60 (2! 의한 분할)

가지고 첫 번째 :이 연산자 (>>)가 숫자의 자리 값을 코드로 옮기고 숫자의 밑 (10)을 변경하지 않으면 코드의 결과에서 볼 수있는 것보다 다른 결과 (12)가 생성되어야합니다. 60). 왜 우리는이 결과 (60)를 볼 수 있지만 12는 볼 수 없습니까?

초 : 이진 왼쪽 시프트 (이게 나에게 맞는 것 같습니다.)는 IDE에서 처음에는 십진수를 이진수로 변경합니까, 그렇지 않습니까?

과 비트에 대한 그리고 논리 게이트 (이 보인다는 것입니다) 인 경우

:

우리는 0과 1 철강을 제외한 다른 값을 넣을 수 있습니다 1.How

이 대답을 ?

2.According 비트 단위 AND 규칙

& Y 1 = Y 다음

는 120이어야하지만 코드 결과 인 1이 설명을 위해 무엇인가?

3. 어떻게하면 (수학 연산과 논리에 따라) 미리 알림을 생성 할 수 있습니까?

+0

시프트는 비트, 즉 기본 2에서 작동하기 때문에 "비트 단위"라고합니다. C++의 숫자는 일반적으로 2 진수로 저장됩니다. 입력 및 출력에 대해서만 10 진수로 변환됩니다. –

+0

'int'는 값을 가지고 있습니다. 값에는 기준이 없습니다. 그래서'a'는 어떤 기지에도 없습니다. C++의'>>'은 항상 기본 2입니다. Ergo, 결과 값 ... –

답변

4

C++의 >> 운영자는 항상 이동, 결코 진수 이동을한다. 소수점 이동 연산자는 없습니다. 원한다면, 그렇게하는 독자적인 함수를 작성할 수 있습니다.

10 진수를 10 진수 자리로 생각하는 것은 잘못이 아니지만 C++이 어떻게 바뀌지는 않습니다. 또한 (오른쪽)이 아닌 (왼쪽)으로 바뀌고 있습니다. 괄호가 가리키는 방향을 확인하십시오.

당신은 또한 비트 단위 정의를 오해했습니다. Y가 비트 일 때 Y & 1 = Y, 입니다. Y가 1 비트 이상일 때 정의는 1 비트 정의를 두 피연산자의 각 비트에 적용하도록 확장됩니다. 그게 무슨 뜻입니까 bitwise 의미합니다. 연산자는 비트 단위로 피연산자에 적용됩니다. 왼쪽 피연산자의 첫 번째 비트는 오른쪽 피연산자의 첫 번째 비트와 결합되어 결과의 첫 번째 비트를 생성합니다. 마찬가지로 두 피연산자 각각의 두 번째 비트는 결과의 두 번째 비트를 결정하며 피연산자의 각 쌍의 비트에 대해서도 마찬가지입니다.

두 숫자를 나눈 나머지를 계산하려면 모듈로 연산자라고도하는 % 연산자를 사용하십시오. C++ 교과서에서 더 자세히 읽어보십시오.

5

C++의 시프트 연산자는 항상 기본 2를 사용합니다. 즉, x >> 1은 값 x을 1 진수 2 자리수만큼 시프트합니다. 그러나 부호가있는 정수를 값을 쉽게 지정하지 않을 때 부호있는 정수를 이동하는 것은 좋지 않습니다. 비트 논리를 사용하여 재생할 때 항상 부호가없는 정수 (예 : unsigned int 또는 unsigned long)를 사용하려고합니다. 또는에 대한 에 대한

if (std::cin >> a) { 
    ... 
} 
else { 
    std::cerr << "ERROR: failed to read value a\n"; 
} 

다른 이항 연산 (&, | : 내부 표현으로 소수 값의 변환은, BTW, 성공을 위해 검사 할 필요가 입력 동작에 의해 이루어집니다 _xor의 경우 ^이고 의 경우 ~은 반전)는 개별 비트에서 작동합니다. 예를 들어 7u & 13u5u입니다. 2의 제곱으로 나눗셈의 나머지를 얻으려면 적절한 비트 마스크로 나누기 전에 을 사용하기 만하면됩니다.

사람들이 바이너리에서 어떻게 작동하는지 더 자세히 알고 싶다면 std::bitset<8>으로 게임하고 싶을 수도 있습니다.이 클래스 템플릿은 비트 단위 연산이 동일하고 정수로 구성 될 수 있으며 개별 비트.

+0

무대 뒤에서 IDE에 의해 처음으로 inpu 10 진수가 바이너리로 바뀌는 그림을 얻었습니다. – Felix

1

가 문자열 "120"을 정수 120으로 변환합니다. 메모리와 CPU에서 정수는 (아마도 시스템에 따라) 32 비트 00000000 00000000 00000000 01111000으로 표시됩니다. 창을 사용하는 경우 숫자의 비트 패턴을 보는 편리한 방법은 프로그래머 모드의 창 계산기입니다.

& 연산은 비트별로 작동합니다.

a  = 00000000 00000000 00000000 01111000 
b  = 00000000 00000000 00000000 00000001 
a & b = 00000000 00000000 00000000 00000000 

따라서 결과가 정수 0 및 작성한으로 1이 아닌 경우 : CPU 각 비트 위치에 대한 결과를 계산 (32) 및 게이트 -있다.

b=231 또 다른 예를, 적어도 하나의 입력 비트가 0

a  = 00000000 00000000 00000000 01111000 
b  = 00000000 00000000 00000000 11100111 
a & b = 00000000 00000000 00000000 01100000 

a = a>>1 모든 비트 결과는 다른 위치에 대한 , 단지 위치 5 및 6에서의 비트가 설정된 96 한 위치가 오른쪽으로 이동합니다. 가장 왼쪽 비트에서 일어나는 일은 부호에 따라 다르므로 비트 조작에 부호없는 데이터 유형을 사용하는 것이 더 좋습니다.

a = 00000000 00000000 00000000 00111100 

당신이 cout << a과 결과를 인쇄

,이 비트 패턴은 문자열 "60"로 진수 표현으로 다시 변환된다.