A B按位操作實現

2021-08-14 19:50:31 字數 1300 閱讀 6919

problem 1:

description: write a function that add two numbers a and b. you should not use+or any arithmetic operators.

a與b均為32位整數。不用加法運算子的話考慮按位計算。

首先 a+b如果有進製時,a+b = 不考慮進製時的運算結果+ 進製值

二進位制加法若不考慮進製,有以下式子:

1 + 1 = 0;1 + 0 = 1; 0 + 0 = 0; 0 + 1 = 1;

恰好與^(按位異或)結果一致:

1^1 = 0; 1^0=1;0^0  = 0; 0^1 = 1;

那麼可以用^計算兩數相加不考慮進製時的運算結果。

同時,若只考慮是否有進製,我們有

1+1 = 1;1+ 0 = 0; 0+0 = 0; 0+1 = 0;

和&(按位與)的結果一致:

1&1 =1 ; 1&0 = 0; 0&0 = 0; 0&1 =0;

進製對結果的實際影響需要由按位左移一位(<<1)完成,也就是(a&b)<<1, 代表兩數相加每位進製代表的值。

a+b = a^b+ (a&b)<<1;

中間的加號又可以通過此方法計算,所以此題需要用到迭代,迴圈到進製值為0則結束。也就是a&b為0時,a+b = a^b,迴圈結束。

/*

* @param a: an integer

* @param b: an integer

* @return: the sum of a and b

*/int aplusb(int a, int b)

return a_;

}

看到一篇文章也提到了用指標來進行運算的方法,
long aplusb(int a, int b)
在c語言中,陣列名就是陣列的首位址,也就是a == &a [0];

對陣列名取位址時,陣列名代表陣列這個變數的變數名,也就是&a代表陣列這個變數的位址。輸出a與&a是一樣的,但是a+1與&a+1則不同因為步長不同。

&str [b]獲取的是第b+1個元素的位址,等於陣列元素首位址+b* 儲存單元的長度(char陣列為1個位元組,int陣列為4個位元組)

在編譯過程中,

int a = 2; int b = 5;

char* s = (char*) a;

s的位址為0x00000002,若輸出s ,s = 2。

因此s[b]的位址為首位址加 b*儲存單元(char*為1),因此可算出兩數相加的值。

位運算實現A B

a b單獨的通過算術運算實現是很簡單的,具體的 操作如下所示 public class solution 下面主要講的是通過位運算子實現相加操作。思路 不使用算術運算求和那麼只能考慮直接在二進位制位上進行位運算,事實上利用異或運算 和與運算 就能完成加法運算要做的事情,其中異或運算完成相加但是不進製...

用位操作實現按子集篩選

最近做使用者許可權控制,遇到乙個需求,可以抽象為使用者的城市屬性都是多城市的,需要列出某城市集合的子集的使用者。最初的使用者 城市關係表有如下範例資料,前一列為使用者id,後一列是城市 1 anshan 1 beijing 1 baotou 1 baoding 1 beihai 1 baoji 1 ...

c c 按位操作

因為有時候需要大量的標誌位來判斷當前狀態等。使用太多的int,bool等會使得程式不 漂亮 這時候需要 位 操作來解決 建立乙個標誌位 unsigned int globalmark 0 在定義一些巨集,如 define control w 0x01 define control a 0x02 de...