對於各進位之間的轉換有什麼好方法嗎?

也就是二進位、八進位、十進位、十六進位之間的轉換,書本上的覺得好麻煩啊(沒那麼聰明).......(不考試我學它幹嘛!!!紙筆考 非機考))


@vczh


如果只是2、4、8、16的話,你只要列印出一張表就行了,就是16進位的16個數字分別對英語2、4、8的什麼東西。


謝邀. 主要是國慶到來,神清氣爽,比較閑~

其實這個知識並不難,自己稍加總結就可以解決.

但本著讓懶人更懶,然後永遠傻下去的邪惡目的,我幫你整理了一份,哈哈.

另外, 無論是用python perl等腳本還是windows 自帶的計算器都很方便檢驗你的計算是否正確, 話說剛看到windows下自帶的計算器竟然還有程序員模式, 深感太孤陋寡聞了,所以隨便自己做了一個demo模擬整數的進位轉換(Qt做的),如下:雖說丑爆了,但畢竟是親生的,怎麼看怎麼順眼..

(ubuntu下編譯出來感覺比windows下好看一些了......)


#include&
#include& #include&
#include&
#include&
#include&
#include&
#include&
#include&
#include&
#define br break
#define wh while
#define re return
#define co continue
#define ll long long
#define bi 0x7fffffff
#define sm -0x7fffffff
#define en printf("
")
#define cl(a) memset(a,0,sizeof(a))
#define fi(a) memset(a,127/3,sizeof(a))
#define sd1(a) scanf("%d",a)
#define sd2(a,b) scanf("%d%d",a,b)
#define sd3(a,b,c) scanf("%d%d%d",a,b,c)
#define slf1(a) scanf("%lf",a)
#define slf2(a,b) scanf("%lf%lf",a,b)
#define slf3(a,b,c) scanf("%lf%lf%lf",a,b,c)
#define sll1(a) scanf("%I64d",a)
#define sll2(a,b) scanf("%I64d%I64d",a,b)
#define sll3(a,b,c) scanf("%I64d%I64d%I64d",a,b,c)
#define pd0(a) printf("%d",a)
#define pd(a) printf("%d
",a)
#define pd_(a) printf("%d ",a)
#define pll0(a) printf("%I64d",a)
#define pll(a) printf("%I64d
",a)
#define pll_(a) printf("%I64d ",a)
#define fr(a,b,c) for(int a=b;a&<=c;a++) #define fo(a,b,c) for(int a=b;a&>=c;a--)
#define frl(a,b,c) for(long long a=b;a&<=c;a++) #define fol(a,b,c) for(long long a=b;a&>=c;a--)
using namespace std;
ll a[512][201],ans[201],k,w,al=1;
int main()
{
sd2(k,w);
int p=1&<&=p-1)w=(p-1)*k;
cl(a),cl(ans);
fr(i,0,p)a[i][0]=a[i][1]=1;
fr(i,1,p)
fo(j,p,1)
{
if(j&>i){fr(l,0,200)a[j][l]=0;co;}
if((i!=1)||(j!=1))fr(l,1,a[j-1][0])
a[j][l]+=a[j-1][l],a[j][l+1]+=a[j][l]/10,a[j][l]=a[j][l]%10;
a[j][0]=max(a[j][0],a[j-1][0]);
wh(a[j][a[j][0]+1]!=0)a[j][0]++;
int t=0;
if((i==p-1)(j&>1)(j&<=w/k))t++; if((j==w/k)(i&<=p-2)(i&>p-(1&<&<(w%k))-1))t++; if(t&>0)
{
fr(ii,1,a[j][0])ans[ii]+=a[j][ii]*t;
al=max(al,a[j][0]);
fr(ii,1,al)if(ans[ii]&>9)
ans[ii+1]+=ans[ii]/10,ans[ii]=ans[ii]%10;
wh(ans[al+1]!=0)al++;
}
}
fo(i,al,1)pd0(ans[i]);
re 0;
}

2的k進位數。可以處理包括負進位的任意進位,自己寫的,不謝。


8421 你懂得


我教人的辦法是統一用2進位中轉。

2進位轉16進位,從末尾隔四位打逗號,最前面不足四位補0,然後把0000-1111轉化成對應的0-F。轉8進位就是隔三位打逗號,然後把000-111轉化成0-7。

16進位轉2進位就是逆操作,逐位把0-F轉換成0000-1111。8進位逐位轉為000-111。

2進位轉10進位,從末尾開始逐個在2進位每位數字下寫1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192……(最好背下來這幾個,後面不夠用再臨時算)。這樣就變成了上面一行2進位,下面一行2的冪。然後看上面是1的,把下面加起來就行了。

10進位轉2進位,也要用到上面那兩行,先看這個10進位的數在上面第二行的哪兩個數之間,比如5398,在4096和8192之間,那就在4096的那位寫1,然後用5398減4096得到1302,用1302再和2048比,比之小,在2048這位寫0,然後繼續和1024比…總之就是從高位往低位比大小,大的寫1同時做減法,小的直接寫0。其實理論上也是逆操作,把它拆成2的冪的和的表達式,有的寫1沒的寫0。

其他轉化的話,先中轉成2進位然後轉成你想要的,這樣看起來貌似多了一步其實速度也不慢,因為2進位和16/8進位之間轉化很快。而且因為是兩步,如果第一步沒問題第二步錯了,從中間來就好。整個過程只有加減法,比什麼除幾取余簡單多了。



Python 解決,簡單易懂

q = True
while q:
num = input("請輸入一個整數(輸入Q結束程序):")
if num != "Q":
num = int(num)
print("十進位 -&> 十六進位 : %d -&> 0x%x" % (num, num))
print("十進位 -&> 八進位 : %d -&> 0o%o" % (num, num))
print("十進位 -&> 二進位 : %d -&> " % num, bin(num))
else:q = False

運行結果

請輸入一個整數(輸入Q結束程序):78
十進位 -&> 十六進位 : 78 -&> 0x4e
十進位 -&> 八進位 : 78 -&> 0o116
十進位 -&> 二進位 : 78 -&> 0b1001110
請輸入一個整數(輸入Q結束程序):26
十進位 -&> 十六進位 : 26 -&> 0x1a
十進位 -&> 八進位 : 26 -&> 0o32
十進位 -&> 二進位 : 26 -&> 0b11010
請輸入一個整數(輸入Q結束程序):


用不到學它幹嘛,哪裡用到的話,多看看看時間長了,眼熟就好了

理解很容易 眼熟就好了嘛 這能有什麼好方法

如果你學網路什麼的,子網劃分,不定長的掩碼用多了,對不同規模的網路用不同的掩碼,慢慢就對一些數字有感覺了。linux下許可權的掩碼也一樣。

如果你用ps,或者網頁中用設置顏色,rgb裡面每個通道0-255的顏色也是八位通道色啊。自己看看#000000到#FFFFFF不同顏色和不同深淺就對16進位有感覺了,還能順便學下色光是如何混合的。

要是你編程裡面用,位運算用一下看看效果,對於8位、16位、32位的變數存儲範圍有個有個了解,拿計算器算明白為什麼這樣就可以啦。

最後,我覺得對於數值,二進位和16進位用得最多,需要最有感覺,其他的知道存在就可以了。

對於感覺,0-255的數字要非常有感覺,再大的數對於臨界值有感覺就可以了,防止溢出神馬噠。

就醬紫


溫逗絲自帶

計算器

就有

程序員模式!!!!


說一下最常用的10進位轉2進位吧,註:此方法適合較小數字的換算,但心算速度較快

首先你需要記住一些的2的N次方(玩過2048吧?就是那些數字)

例如:2,4,6,8,16,32.......2048,4096,8192等等

比如需要得到10000的2進位是多少

首先找到小於10000並且最接近10000的數,8192

用10000 / 8192=1 (1808)(之後用1808除4096)

1808 / 4096=0 (1808)

1808 / 2048=0 (1808)

1808 / 1024=1 (784)

784 / 512=1 (272)

272 / 256=1 (16)

16 / 128=0 (16)

16 / 64=0 (16)

16 / 32=0 (16)

16 / 16=1 (0)

0 / 8=0 (16)

0 / 4=0 (16)

0 / 2=0 (16)

0 / 2=0 (16)

結果為:10011100010000


按下 F12

1.按下「F12」,調出控制台

2. parseInt("0xad",16).toString(2)

怎麼玩都行···


先轉成2進位,2進位轉成幾進位值都容易。


《編碼的奧秘》

抓一隻海豚,一隻龍蝦,一隻米老鼠來數。Charles Petzold老師教我的。


不藉助程序的話,首先2^0, 2^12記熟吧。然後建議去學下單片機八位流水燈和數碼管編碼幫助理解。如果你是單純的懶,無解。


這個回答給 OS X 用戶的。

---

不過都完機靈還是要多說兩句的。一般情況下要求計算的數字不大是可以湊出來的,不過你要對幾個二進位整數比較熟悉,比如:

1,2,4,8,16,32,64,128,256,512,1024,2048,4096……然後記住它們對應的是2的幾次方,然後挨個減。

例如:345轉2進位,找最接近它而且小於它的,

345-256=89, 2^8*1,

89-128&<0, 2^7*0,

89-64=25, 2^6*1,

25-32&<0, 2^5*0,

25-16=9, 2^4*1,

9-8=1, 2^3*1,

1-4&<0, 2^2*0,

1-2&<0, 2^1*0,

1, 2^0*1

所以345=101011001

然後二進位轉換8和16就簡單的多。。。時間不夠去上課了。。


推薦閱讀:

UUID是如何保證唯一性的?
程序員能20分鐘徒手寫出一個沒bug的快速排序嗎?(可以調試)
如何在最短的時間內搞定數據結構和演算法,應付面試?
如果按國家分,哪個國家編程最厲害?有沒有代表人物?

TAG:思考方法 | 演算法 | 計算機 | 計算機科學 | 進位 |