目錄
一,知識點
1,主知識點
2,補充知識點
二,習題
1,371. 兩整數之和 - 力扣(LeetCode) (leetcode-cn.com)
2,面試題 08.05. 遞回乘法 - 力扣(LeetCode) (leetcode-cn.com)
三,總結
一,知識點
1,主知識點
這是C語言打卡的第一篇,主要就是熟悉一下基本的輸入輸出,函式,一些基本的語法結構如:選擇,回圈等,預處理的指令等,一般刷題的都已經有一門語言的基礎,這里就不多贅述,我們直接上題目,
2,補充知識點
主要是今天的題目中會使用到 ^ 和&這兩個運算子大家應該都不會很陌生,
按位與,大家如果不是很熟悉可以先看看我的這篇文章:
【萬人千題】12.1演算法:位與運算子_C_Ryson的博客-CSDN博客
按位異或相同數為0,不同數為1,而按位與與上1則不變,與上0則改變,
那么接下來我們一起來看看
0001 1的二進制表示
0010 2的二進制表示
1&2,結果是0000
1^2,結果是0011
我們會發現,1+2的結果是3,而1^2好像就是3?從這里我們可以初步感覺到,^ 運算與加法有點關系,
再來看看1和3:
0001 1的二進制表示
0011 3的二進制表示
1&3,結果是0001
1^3,結果是0010
異或完還是2,少了2?這是怎么回事呢?主要是兩個都是1時,二進制中是需要進位的,而按位異或的操作是不會主動去給需要進位的數進位的,這樣一來就造成一旦有需要進位的數相加,就會出錯,我們也可以發現,^ 就像是不進位的加法,
那么進位該如何處理?按位&還未上場!按位與只有當兩位上都是1時才會是1,而兩位上都是1相加不就需要進位了嗎?所以將兩數按位與就可以知道那些位是需要進位的,從而實作處理,在下面的習題中結合講解,
二,習題
1,371. 兩整數之和 - 力扣(LeetCode) (leetcode-cn.com)
371. 兩整數之和
給你兩個整數
a和b,不使用 運算子+和-,計算并回傳兩整數之和,
解法一:
int getSum(int a, int b)
{
return a+b;
}
大家一開始可以直接用這個過掉,但是不要忘記把題目收錄到自己創建的需要重做的題目中去,就像下面這樣,

當然,這里給出解法二:
正如上面所說,按位異或是不進位的加法,按位與記錄了需要進位的位的位置(有點繞),
代碼如下:
int getSum(int a, int b)
{
unsigned int i=a&b;
int ans=a^b;
while(i!=0)
{
i<<=1;
int tmp=ans^i;
i=ans&i;
ans=tmp;
}
return ans;
}
解釋:

2,面試題 08.05. 遞回乘法 - 力扣(LeetCode) (leetcode-cn.com)
解法一:(遞回)
int multiply(int A, int B)
{
if(B==1)
return A;
else
return A+multiply(A,B-1);
}
既然不能用乘法,我們就用加法來實作乘法,A*B實際上就是B個A(或者A個B)相加,那我們直接讓A加上B個自己就可以了,
解法二:(回圈)
int multiply(int A, int B)
{
int tmp=A;
B-=1;
while(B--)
{
A+=tmp;
}
return A;
}
三,總結
出了一點錯誤,我重新修改了博客,希望沒有誤導大家,對于位運算還是有很長的路要走,重新來想一下之前的題目還是好的,對于位與和異或運算有了更多一點的了解,小伙伴們堅持下來,大家一起努力吧!加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/377073.html
標籤:其他
上一篇:(Java)構造二叉樹OJ題(LeetCode105 根據前序與中序構造二叉樹,LeetCode106 根據后序與中序構造二叉樹)
