#include <iostream>
//#include <bitset>
using namespace std;
int main(void)
{
int i,j,k,l;
cout<<"Input i(oct),j(hex),k(hex),l(dec):"<<endl;
cin>>oct>>i; //输入为八进制数
cin>>hex>>j; //输入为十六进制数
cin>>k; //输入仍为十六进制数
cin>>dec>>l; //输入为十进制数
cout<<"hex:"<<"i = "<<hex<<i<<endl;
cout<<"dec:"<<"j = "<<dec<<j<<'\t'<<"k = "<<k<<endl;
cout<<"oct:"<<"l = "<<oct<<l;
cout<<dec<<endl; //恢复十进制数输出状态
return (0);
}
运行结果:

思考与提示
1. 在接收输入时,必须在cin中指明数制,否则从键盘输入时,不认八进制和十六进制数开头的0和0x标志。指明后可省略0和0x标志。
如下面的输入输出结果:

2. 进制控制只适用于整型变量,不适用于实型和字符型变量。
3. 输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。
4. 在cin或cout中指明数制后,该数制将一直有效,直到重新指明使用其他数制。
下面是C++中二进制输出的总结
#include<iostream>
#include<list>
#include<bitset>
using namespace std;
//递归输出二进制函数。
void BinaryRecursion(int n)
{
int a;
a = n % 2;
n = n >> 1;
if(0 != n)
{
BinaryRecursion(n);
}
cout << a ;
}
//使用容器转换二进制
void BinaryVector(int n)
{
list<int>L;
int temp = n;
while(0 != temp)
{
L.push_front(temp % 2);
temp = temp >> 1;
}
for(list<int>::iterator iter = L.begin(); iter != L.end(); iter++)
{
cout << *iter;
}
cout << endl;
}
//逐位与1做运算
void Binarycout(int n)
{
for(int i = 31; i >= 0; i--)
cout << ((n >> i)&1);
cout << endl;
}
//利用bitset转换成二进制。
void Binarybitset(int n)
{
cout << bitset<sizeof(int)*8>(n);
cout << endl;
}
int main()
{
int i = 1047;
int j = i >> 2;
int k = i << 2;
cout << "使用BinaryRecursion:" << endl;
BinaryRecursion(i);
cout << endl;
BinaryRecursion(j);
cout << endl;
BinaryRecursion(k);
cout << endl;
cout << endl;
cout << "使用BinaryVector:" << endl;
BinaryVector(i);
BinaryVector(j);
BinaryVector(k);
cout << endl;
cout << "使用Binarycout:" << endl;
Binarycout(i);
Binarycout(j);
Binarycout(k);
cout << endl;
cout << "使用Binarybitset:" << endl;
Binarybitset(i);
Binarybitset(j);
Binarybitset(k);
return 0;
}
输出为:

下面介绍一下c++中的左移右移运算符
移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。
逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。
算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。
c++中,整数分有符号数和无符号数两种,对于这两种数做左移、右移运算,稍有区别:
1、如果是无符号数,不管是左移还是右移都是“逻辑移位”
例如,分别对无符号数 179 做左移、右移操作的结果,

2、如果是有符号数,
2a,如果是做左移运算,那么做的是“逻辑移位”,同 1中无符号数的左移。
2b,如果是做右移运算,那么做的是“算术移位”。

对于当前的大多数c/c++编译器来说,都是按照上面所讲实现的。
注:因为负数在内存中是以补码形式存储,本文中介绍的进制转换只适用于无符号数。
|