為了在堅(jiān)持的一開始,就能設(shè)立一個(gè)我一定在刷的路上的態(tài)度层皱,今天為了這人生中第三道leetcode題目捧著手機(jī)熬了夜础钠。
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example:
Given a = 1 and b = 2, return 3.
首先蒸走,很開心的一點(diǎn),第一次用手機(jī)瀏覽器寫leetcode玖瘸,由于瀏覽器問題,光標(biāo)亂竄很蹩腳檀咙。也是第一次手機(jī)碼簡(jiǎn)書雅倒,發(fā)現(xiàn)可以直接用markdown,幸好昨天學(xué)了常用的md.語(yǔ)法弧可,可以專注的碼字了蔑匣。
1+2為什么=3?我想了很久
昨晚臨睡前喵的這一眼問題時(shí)侣诺,我第一反應(yīng)確實(shí)是位運(yùn)算殖演。我知道計(jì)算機(jī)一定是通過(guò)位運(yùn)算實(shí)現(xiàn)加號(hào)功能的。
不小心復(fù)習(xí)了pow和log函數(shù)
但是我不記得位運(yùn)算了年鸳,尤其是位移趴久。突然想起來(lái)log與次方的數(shù)學(xué)公式,很開心的以為我可以如此實(shí)現(xiàn):
HOWEVER, 次方直接導(dǎo)致運(yùn)算溢出搔确。我徹底忘了還有范圍彼棍。灭忠。
收獲了位運(yùn)算的果實(shí)
Pascal和C中的位運(yùn)算符號(hào)
下面的a和b都是整數(shù)類型,則:
C語(yǔ)言 | Pascal語(yǔ)言
-------+-------------
a & b | a and b
a | b | a or b
a ^ b | a xor b
~a | not a
a << b| a shl b
a >> b | a shr b
基本已經(jīng)理解座硕,等有電腦了弛作,我再來(lái)貼上刷法~
7月16日02:00
7月16日12:23
終于通過(guò)在紙上一步步的演算模擬計(jì)算機(jī)計(jì)算加號(hào)的過(guò)程完成了1+2這道題。
class Solution {
public:
int getSum(int a, int b) {
//進(jìn)位結(jié)果是tmp,即a和b的二進(jìn)制同為1時(shí)進(jìn)位华匾。
int tmp = 1;
while(tmp) //只要還有需要進(jìn)位的地方
{
tmp = a & b;//還沒有左移的進(jìn)位結(jié)果
b = a ^ b; //不帶進(jìn)位的相加結(jié)果
a = tmp << 1; //此時(shí)的a與b相加變成了帶左移的進(jìn)位結(jié)果與不帶進(jìn)位的相加結(jié)果的和
}
return b;//當(dāng)沒有進(jìn)位時(shí)映琳,結(jié)果就是b
}
};
以上步驟完全是一張演算紙變化過(guò)來(lái)的,很想貼演算紙的圖蜘拉,但我更希望讀者和我自己能夠每次不會(huì)的時(shí)候都重新演算一遍萨西。