細節知識補充
1:條件運算子
賦值陳述句?運算式1:運算式2
關系運算子>的優先級高于?:,
條件運算子 和 條件運算式 的幾個特點總結如下:
??1)條件運算子是唯一的三目運算子;
??2)條件運算子是右結合的;
??3)條件運算子的優先級非常低,僅高于賦值運算子 和 逗號運算子;
問題一給你兩個整數 a 和 b ,不使用 運算子 + 和 - ???????,計算并回傳兩整數之和,
運用了計算機組成原理的知識 通過二進制中的位運算
0+0=0 1+1=0進位 1
<< c中二進制碼左移一位,即刪去最高位,低位補0
思路計算機中整數存盤方式為二進制補碼,兩數相異或得到每位相加結果,相與得到每位進位結果,進位結果要進一位計算,進位不等于0遞回計算進位結果加相異或結果,直到進位為0結束
無符號整型(unsigned int)
無符號short 型別范圍是0~65535,二進制表示:0000 0000 0000 0000 – 1111 1111 1111 1111
有符號short 型別范圍是0~32767它的二進制為:0000 0000 0000 0000 – 0111 1111 1111 1111
最高位表符號 0正 1負
1.題目關鍵詞 -二進制操作 ,補碼,資料型別
兩數相加
int getSum(int a, int b)
{
int sum ,carry;
sum=a^b;
carry=((unsigned int)a & b)<<1; //進位結果加到上一位 //int向上溢位會變成負數
if(carry!=0)
{
return getSum (sum,carry);
} //這種遞回是在結尾處結束的
return sum ;
}
};
2.題目關鍵詞 補碼 位操作 快速冪演算法
不用*符號實作乘法操作
快速冪演算法如下
一個講解該演算法的博客
快速冪演算法
class Solution {
public:
int multiply(int A, int B)
{ int res=0;
while(B)
{
if(B&1)
{
res+=A;
}
B>>=1; //對B進行除二操作,借助位移實作
if(B)
{
A+=A;
}
}
return res;
};
};
另一道杭電的題,使用快速冪演算法
奇數偶數通過位運算判斷
&
power=power/2來說,也可以用更快的“位運算”進行替代,我們只要把power的二進制表示向右移動1位就能變成原來的一半了,
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power & 1) {//此處等價于if(power%2==1)
result = result * base % 1000;
}
power >>= 1;//此處等價于power=power/2
base = (base * base) % 1000;
}
return result;
}
class Solution {
public:
double myPow(double x,int n) //int型別
{
double res=1.0;
long k=n;
if(n<=0){
x=1/x;
k=-(long)n;//n不能直接轉正,負數最小值轉正溢位,否則這個用例過不了2.00000 -2147483648
}
while(k!=0)
{
if(k&1)
{
res*=x;
}
k>>=1;
if(k)
{
x=x*x;
}
}
return res;
}
};//求A的B次方函式
總結 今日學會了快速冪演算法,C++位移操作 ?運算子 對編碼與程式的聯系有了一些初步的認知
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/404322.html
標籤:其他
上一篇:【論文閱讀】A2S-Det: Efficiency Anchor Matching in Aerial Image Oriented Object Detection
下一篇:【一起入門MachineLearning】中科院機器學習-期末題庫-【單選題5,7,69+多選題3+計算題9,10,11】
