原碼、反碼、補碼都是一樣的,都是正數本身。
對於負數:
原碼是符號位為 1,數值部分取絕對值的二進位制。
反碼是符號位為 1,其它位是原碼取反。
補碼是符號位為 1,其它位是原碼取反,未位加 1。
輸入一個 64bit 十進位制整數,輸出它的原碼,反碼,補碼的 16 進製表示法
數字邏輯練習題-(二進位制/16進位制模擬)
數字邏輯練習題
時間限制: 1 Sec 記憶體限制: 128 MB提交: 291 解決: 48
[提交][狀態][討論版]
題目描述
輸入
有多組資料,每組資料一行,為一個 64bit 十進位制整數,包含正負符號和數值,格式見樣例。
輸入保證有唯一原碼,反碼,補碼對應。
輸入保證有唯一原碼,反碼,補碼對應。
輸出
每組輸出三個 16 進位制數,分別為原碼,反碼,補碼。
樣例輸入
+1
-1
+10086
-2333333
樣例輸出
0x0000000000000001
0x0000000000000001
0x0000000000000001
0x8000000000000001
0xfffffffffffffffe
0xffffffffffffffff
0x0000000000002766
0x0000000000002766
0x0000000000002766
0x8000000000239a95
0xffffffffffdc656a
0xffffffffffdc656b
注意正零負零
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <set>
#include <math.h>
#include <algorithm>
#include <queue>
#include <iomanip>
#include <map>
#include <bitset>
#include <ctime>
#define INF 0x3f3f3f3f
#define MAXN 1005
#define Mod 1000000007
using namespace std;
char f[20]= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//10進位制對應的16進位制
char ans[20];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("G:/cbx/read.txt","r",stdin);
//freopen("G:/cbx/out.txt","w",stdout);
#endif
long long n;
char cn[MAXN];
while(cin>>cn)
{
bool z=true;//正數標誌
bool fl=false;//負零標誌
if(cn[0]=='-') z=false;
if(cn[0]=='-'&&cn[1]=='0')
fl=true;
n=atoll(cn);
if(z)//正數
{
memset(ans,'\0',sizeof(ans));
int lans=0;
//原碼
string c="";
while(n)//轉二進位制
{
c+=char((n%2)+'0');
n/=2;
}
int lenc=c.size();
string cc="";
int lencc=0;
for(int i=lenc-1; i>=0; --i)//翻轉
cc[lencc++]=c[i];
for(int i=0; i<lenc; ++i) c[i]=cc[i];
char ch[5];
int l=0,r=0;
if(lenc<64)//不足64位前面補零
{
cc="";
for(int i=0; i<64-lenc; ++i) cc+="0";
cc+=c;
c=cc;
}
lenc=c.size();
for(int i=0; i<lenc; ++i)
{
if(i!=0&&(i+1)%4==0)//每次取4位處理
{
r=i;
memset(ch,'\0',sizeof(ch));
int cnt=0;
for(int j=l; j<=r; ++j)
ch[cnt++]=c[j];
ch[r+1]='\0';
int nn=strlen(ch);
int w=1;
int temp=0;
while(nn--)//轉成十進位制
{
temp+=(ch[nn]-'0')*w;
w*=2;
}
ans[lans++]=f[temp];//對應的16進位制
l=i+1;
}
}
cout<<"0x";
for(int i=0; i<lans; ++i)
{
if(int(ans[i])<48) ans[i]+='0';
cout<<ans[i];
}
cout<<endl;
//反碼
cout<<"0x";
for(int i=0; i<lans; ++i)
{
if(int(ans[i])<48) ans[i]+='0';
cout<<ans[i];
}
cout<<endl;
//補碼
cout<<"0x";
for(int i=0; i<lans; ++i)
{
if(int(ans[i])<48) ans[i]+='0';
cout<<ans[i];
}
cout<<endl;
}
else//負數
{
char ans[20];
memset(ans,'\0',sizeof(ans));
int lans=0;
//原碼
n=abs(n);
string c="";
while(n)
{
c+=char((n%2)+'0');
n/=2;
}
int lenc=c.size();
string cc="";
int lencc=0;
for(int i=lenc-1; i>=0; --i)
cc[lencc++]=c[i];
for(int i=0; i<lenc; ++i) c[i]=cc[i];
char ch[5];
int l=0,r=0;
if(lenc<64)
{
string ccc="";
for(int i=0; i<64-lenc; ++i)
ccc+="0";
ccc+=c;
c=ccc;
}
lenc=c.size();
c[0]='1';//負數標誌位置1
//cout<<c<<endl;
l=0,r=0;
cout<<"0x";
for(int i=0; i<lenc; ++i)
{
if(i!=0&&(i+1)%4==0)
{
r=i;
memset(ch,'\0',sizeof(ch));
int cnt=0;
for(int j=l; j<=r; ++j)
ch[cnt++]=c[j];
ch[r+1]='\0';
int nn=4;
int w=1;
int temp=0;
while(nn--)
{
temp+=(ch[nn]-'0')*w;
w*=2;
}
cout<<f[temp];
l=i+1;
}
}
cout<<endl;
//反碼
for(int i=1; i<lenc; ++i)
{
if(c[i]=='0') c[i]='1';
else if(c[i]=='1') c[i]='0';
}
l=0,r=0;
lans=0;
lenc=c.size();
cout<<"0x";
for(int i=0; i<lenc; ++i)
{
if(i!=0&&(i+1)%4==0)
{
r=i;
memset(ch,'\0',sizeof(ch));
int cnt=0;
for(int j=l; j<=r; ++j)
ch[cnt++]=c[j];
ch[r+1]='\0';
int nn=4;
int w=1;
int temp=0;
while(nn--)
{
temp+=(ch[nn]-'0')*w;
w*=2;
}
ans[lans++]=f[temp];
cout<<f[temp];
l=i+1;
}
}
cout<<endl;
//補碼
if(fl) c[0]='0';//負零
for(int i=1; i<lenc; ++i)
{
if(c[i]=='0') c[i]='1';
else if(c[i]=='1') c[i]='0';
}
int pos=-1;
for(int i=63; i>0; --i)
{
if(c[i]=='1')//找到低位第1個1
{
pos=i;//標記下標
break;
}
}
if(pos!=-1)//從第1個1向高位各位取反
{
for(int i=pos-1; i>0; --i)
{
if(c[i]=='0') c[i]='1';
else if(c[i]=='1') c[i]='0';
}
}
l=0,r=0;
lans=0;
lenc=c.size();
cout<<"0x";
for(int i=0; i<lenc; ++i)
{
if(i!=0&&(i+1)%4==0)
{
r=i;
memset(ch,'\0',sizeof(ch));
int cnt=0;
for(int j=l; j<=r; ++j)
ch[cnt++]=c[j];
ch[r+1]='\0';
int nn=4;
int w=1;
int temp=0;
while(nn--)
{
temp+=(ch[nn]-'0')*w;
w*=2;
}
ans[lans++]=f[temp];
cout<<f[temp];
l=i+1;
}
}
cout<<endl;
}
}
return 0;
}
提示
相關文章
- 進位制詳解:二進位制、八進位制和十六進位制
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- printf()將10進位制數安照輸出16進位制,8進位制輸出
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 負數補碼(16進位制轉10進位制的負數)
- 在c語言中輸出8進位制數,16進位制數C語言
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 二進位制與二進位制運算
- C語言中printf打出2進位制與16進位制數C語言
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 二進位制、十進位制與十六進位制相互轉化
- 十進位制——二 (八、十六 )進位制
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 二進位制轉十進位制快速方法
- 二進位制
- (二進位制)
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 藍橋杯 基礎練習 十六進位制轉八進位制
- 負數的二進位制數問題
- 牛客網測試題 把十六進位制數字轉換為十進位制數字
- C printf按8進位制、10進位制、16進位制輸出以及高位補0
- 教你如何進行數倉字串、二進位制、十六進位制互轉字串
- Java中8進位制和16進位制的表示方法Java
- 輸出二進位制數
- ROP【二進位制學習】
- 十進位制轉二進位制推導(草稿)
- JavaScript十進位制轉換為二進位制JavaScript
- 什麼是二進位制?二進位制如何轉換?
- 如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出
- 每日一練(39):二進位制求和
- 八進位制,十六進位制和浮點數