2013-05-10 1 views
1

내가 예를 들어C++ 비트 연산 16, 32 비트 순간에

print((short) 1); 

내가 00000001의 가치를 얻을 수 있도록 비트에 숫자 값을 출력 스크립트를 가지고,하지만 난에 대한 방법을 얻을 수 있습니다 이 값은 00000001 00000000이고, print((int) 1);을 인쇄 할 경우 나는 00000001 00000000 00000000 00000000 값을 얻습니다.

void printbyte(unsigned char x) 
{ 
    for (int i = 0; i < 8; i++) 
    { 
     if (x & 0x80) cout << 1; 
     else cout << 0; 
     x = x << 1; 
    } 
    cout << endl; 
} 

template <typename T> 
void print (T A) 
{ 
    unsigned char *p = (unsigned char *) &A; 
    printbyte(*p); 
} 

int main() 
{ 
    print((short) 1); 

    system("pause"); 
    return 0; 
} 
+0

'printbyte'가'00000001 00000000 00000000 00000000'를 인쇄 할 수 없습니다. 8 개의 BITS 만 인쇄합니다. – Nawaz

+0

'8 '을'sizeof (x)'로 대체하십시오. – 0x499602D2

답변

3

당신은 단지 각 바이트, 예를 들어, 대한 printbyte를 호출 한 후 처리하기 위해 얼마나 많은 바이트 결정 print 내에서 sizeof(T)을 사용하고 있습니다 : 여기 내 코드입니다

#include <iostream> 
#include <climits> 

using namespace std; 

void printbyte(unsigned char x) 
{ 
    for (int i = 0; i < CHAR_BIT; i++) 
    { 
     cout << ((x & 0x80) != 0); 
     x <<= 1; 
    } 
} 

template <typename T> 
void print (T A) 
{  
    for (size_t i = 0; i < sizeof(T); ++i) 
    { 
     unsigned char b = A >> ((sizeof(T) - i - 1) * CHAR_BIT); 
     //unsigned char b = A >> (i * CHAR_BIT); // use this for little endian output 
     printbyte(b); 
     cout << " "; 
    } 
    cout << endl; 
} 

int main() 
{ 
    print((short) 1); 
    print((long long) 42); 

    return 0; 
} 
+0

이것은 매우 좋아 보이지만 '00000001 00000000 00000000 00000000' 대신'00000000 00000000 00000000 00000001'을 보여줍니다. 올바르게 바꿀 수 있습니까? 어쨌든 고마워! – Sangsom

+0

글쎄, 루프의 순서를 바꾸는 것은 매우 쉬울 것이지만, 나는 little endian 형식으로 그 값을 인쇄하는 것이 다소 혼란 스럽다고 생각합니다. 그게 당신이 원하는 것뿐이라면,'unsigned char b = A >> (sizeof (T) - i - 1) * CHAR_BIT);를'unsigned char b = A >> (i * CHAR_BIT);'로 변경하십시오. –

+0

와우, 놀라운 친구 야, 고마워! – Sangsom

0

비트셋을 사용할 수 있습니다. 가장 쉬운 방법입니다.

#include <iostream> 
#include <climits> 
using namespace std; 

template <typename Type> 
void bprint(Type in) 
{ 
    unsigned char* p = (reinterpret_cast<unsigned char*>(&in))+(sizeof(Type)-1); //x86 
    for(unsigned int n = sizeof(Type);n--;--p, std::cout<<' ') 
    for(unsigned int i = CHAR_BIT;i--;) 
    std::cout<<((*p&char(1<<i))!=0); 
    std::cout<<'\n'; 
} 

int main(void) 
{ 
int number; 
cin>>number; 
bprint(number); 
bprint(short(number)); 
bprint(char(number)); 
return 0; 
} 

"서명"전에 "의 char *를"

#include <iostream> 
#include <bitset> 

using namespace std; 

int main() 
{ 
int number; 
cin>>number; 
bitset <16> end (number); 
cout<<number<<" --> "<<end<<'\n'; 
return 0; 
} 

또는 참조 : 당신은 표준 용액을 사용하지 않으면 http://www.cplusplus.com/reference/bitset/bitset/

, 또한 다음과 같을 수 있습니다 여기에 예제 기본적으로 설정되지 않은 경우 필요합니다. 변수의 메모리에 접근하는 것은 변수의 타입이나 unsigned char의 포인터만을 가지고있다.

가장 흥미로운 옵션은 특히 Gynvael Coldwind (여기에는 http://gynvael.coldwind.pl/n/c_cpp_number_to_binary_string_01011010)에 설명 된 수학의 사용입니다.

0

std::bitset을 사용해야한다고 생각하지만 컴파일시 항상 크기를 지정해야합니다. 것을 방지하기 위해, 당신은 (이 C++ 11 참고)과 같은 템플릿 기능을 사용할 수 있습니다 :

#include <iostream> 
#include <bitset> 
#include <limits> 

template <class T> void PrintBits (const T &Number) { 
    std::bitset<std::numeric_limits<T>::digits> Bit_Number(Number); 
    std::cout << Bit_Number << std::endl; 

}