位運算的技巧題

2021-07-23 23:13:48 字數 1179 閱讀 1269

位運算非常的巧妙,有時會讓題目的解法非常簡單,但是其技巧性很強,因此這裡自己將一些關於位運算的題目進行了總結。

此題的範圍為int32內。因為不能用比較運算,自然的想到位運算,如下的一種常規的解法。

1. 計算c=a-b判斷c的正負

2. (n>>31)&1 =1 則說明n為負數,否則為正數

int flip(int n) 

intsign(int n)

int getmax(int a, int b)

但是上述沒有考慮到是否會出現溢位情況,因此考慮此情況**如下:

#include 

using

namespace

std;

int flip(int n)

int sign(int n)

int getmax1(int a, int b)

int getmax(int a, int b)

int main()

#include 

using

namespace

std;

int add(int a, int b)

return sum;

}int add1(int a, int b)

//a-b=a+(-b)

int my_minus(int a, int b)

//乘法正規化

//a*b=a*2^0*b(0)+a*2^1*b(1)+...a*2^31*b(31);

int sign(int n)

int multi(int a, int b)

return c ? res : add(~res, 1);

}//除法

int my_div(int a, int b)

}return a < 0 ^ b < 0 ? add(~res, 1) : res;}//

int divde(int a, int b)

else

return my_div(a, b);

}int main()

位運算的技巧

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...

位運算的技巧

1.找到乙個整數的二進位制中最後一位1的位置 int split a a 1 a int split a a 1 注意split不是位置。2.將乙個數的最後一位1變為0 n n n 1 3.乙個整數的二進位制中1的個數 int res 0 while n 0 return res 4.判斷乙個數是不...

位運算的技巧

在討論位運算之前有必要補充一下計算機底層使用的編碼表示,計算機內部儲存 計算的任何資訊都是由二進位制 0和1 表示,而二進位制有三種不同的表示形式 原碼 反碼和補碼。計算機內部使用補碼來表示。原碼,就是其二進位制表示 注意,有一位符號位 反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反 ...