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...