如何將字元轉換成數字

2021-09-29 13:20:05 字數 1667 閱讀 6476

在我們計算高精度加減乘除時,因為無法用long long讀入乙個很大很大的數,所以我們先用讀入字串的方式讀入,然後再將字串的每一位轉換成數字。

char sa[100];

int a[100];

int len;

gets(sa);

len=strlen(sa);

for(int i=0;i眾所周知,位運算的速度比加減乘除啥的更快,所以,其實我們可以用一種極其有趣(玄學)的方法。

a[len-i-1]=sa[i]-48 --> a[len-i-1]=sa[i]^48

你肯定要問為啥(畢竟我剛看到這種的方法就懵了),異或能和減一樣?

其實能做到這樣的效果都是因為48

4848

這個數有點小特殊。

眾所周知,48

4848

的二進位制數為110000

110000

110000

。假設我們要將字元′5′

'5'′5

′轉換成數字5

55,首先我們都知道,′5′

'5'′5

′的ascl

lascll

ascl

l值為53

5353

,轉換成二進位制即為110101

110101

110101

。其次,異或的運算規則是,每一位二進位制位相同為0

00,不同為1

11,所以110000xo

r110101

110000xor110101

110000

xor1

1010

1為101

10110

1,而這個數轉換成十進位制就是5

55,因此異或48

4848

,就相當於減去48

4848

了。注意點:我們上述的技巧適用於字元′0′

'0'′0

′~′9

′'9'

′9′轉換成數字,若是其他字元對映成數字可能並不成功。

我再講乙個我覺得十分炫酷的位運算小技巧:

如果你要計算乙個數乘以10

1010

,再用a∗10

a*10

a∗10

,就太low了,你應該用:a=(a+a<<2)<<1;

與(a nd

andan

d,&):都為1為1

或(o ror

or,|):都為0為0

非(n ot

notno

t,~):若1則0,若0則1

異或(xor

xorxo

r,^):不同為1,相同為0

移位:左移:1

<

2n

1<

1<

2n,n

<

<1=

n∗

2n<<1=n*2

n<

<1=

n∗2右移:n

>

>1=

n/

2n>>1=n/2

n>

>1=

n/2(下取整)

完結撒花!

羅馬字元轉換成數字

羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中小...

如何將DataTable轉換成List

using system using system.collections.generic using system.linq using system.text using system.data using system.collections using system.reflection n...

js字串轉換成數字,數字轉換成字串

將字串轉換成數字,得用到parseint函式。parseint string 函式從string的開始解析,返回乙個整數。舉例 parseint 123 返回 123 int parseint 1234 返回 1234 int 如果解析不到數字,則將返回乙個nan的值,可以用isnan 函式來檢測 ...