回答
明年很高,你可以使用Hakmem 175:
項目175(高斯帕):
unsigned nexthi_same_count_ones(unsigned a) {
/* works for any word length */
unsigned c = (a & -a);
unsigned r = a+c;
return (((r^a) >> 2)/c) | r);
}
對於下一:
要使用相同數量的1位獲得下一個更高的數降低我不知道一個快速的算法,所以我會使用經典的方法,如果數字>然後2^0 + 2^1 + ... 2^n然後從您的數字中扣除一個並計算比特數。具有n位的第一個數是一個。
oops ...'nexthi_same_count_ones(0)' – pmg 2011-03-31 10:51:13
請問您能解釋一下這個算法嗎?例如,每個計算的含義是什麼 – SecureFish 2011-07-28 22:02:46
@Dumitrescu:我有一個疑問,大多數情況下(特別是C)如果我們執行和操作一個數字及其當下( - 應用於該數字)。它總是會呈現1.我們可以直接將((r^a)>> 2)除以1.爲什麼我需要計算該操作?這只是我的疑問。對不起,如果我不明白的東西。 – 2013-09-22 15:52:04
對於較小
int getNextSmaller(int num) {
return ~getNextLarger(~num);
}
有時候,事情就是這樣簡單。 :)
鏈接已損壞。你是怎麼得到這個的?請添加一個例子 – 2014-08-29 16:06:56
Here是一個很好的解釋。 :)
請參閱下面的樣本編號156。我也發佈了詳細解釋的來源。
{
x = 156
10011100 becomes 10100011
To get the next higher number we need to set the 6th bit from LSB and shift
the string of 1's (3rd,4th,5th) to LSB positions 1,2 and drop 5th bit
所以我們得到163 - 10100011,這是旁邊有相同數量的1爲156
00011100 - right most string of 1's in x
00000011 - right shifted pattern except left most bit ------> [A]
00010000 - isolated left most bit of right most 1's pattern
00100000 - shiftleft-ed the isolated bit by one position ------> [B]
10000000 - left part of x, excluding right most 1's pattern ------> [C]
10100000 - add B and C (OR operation) ------> [D]
10100011 - add A and D which is required number 163
最多}
{
uint_t snoob(uint_t x)
{
uint_t rightOne;
uint_t nextHigherOneBit;
uint_t rightOnesPattern;
uint_t next = 0;
if(x){
// right most set bit
rightOne = x & -(signed)x;
// reset the pattern and set next higher bit
// left part of x will be here
nextHigherOneBit = x + rightOne;
// nextHigherOneBit is now part [D] of the above explanation.
// isolate the pattern
rightOnesPattern = x^nextHigherOneBit;
// right adjust pattern
rightOnesPattern = (rightOnesPattern)/rightOne;
// correction factor
rightOnesPattern >>= 2;
// rightOnesPattern is now part [A] of the above explanation.
// integrate new pattern (Add [D] and [A])
next = nextHigherOneBit | rightOnesPattern;
}
return next;
}
}
來源:http://www.geeksforgeeks.org/next-higher-number-with-same-number-of-set-bits/
- 1. 用位操作添加2個整數
- 2. 爪哇 - 位操作(算上個1號)
- 3. 使用整數提升的位操作
- 4. 有符號整數的按位操作
- 5. 給定整數的2位數
- 6. 位操作:獲取一個數字中的單個位
- 7. 按位操作C#陣列元件(0-1)轉印到整數
- 8. 在特定數量的位置上僅移位整數中的1位
- 9. 位操作轉換爲整數
- 10. 如何在一個字節整數中存儲2位,1位,1位和4位值
- 11. 將64位整數中的每一位比較爲一個32位整數
- 12. 64位上的按位與長整數與整數的性能
- 13. 位向量建立一個字節數組 - 瞭解位操作
- 14. 位操作:修改32位整數以包含子串
- 15. 按位操作的操作
- 16. 如何表示一個多位數的整數?例如代表1作爲01
- 17. 如何在給定低位和高位的情況下生成一個64位二進制補碼整數?
- 18. 確定通過位操作
- 19. WordPress的/ MySQL的 - >獲得職位id與一個給定職位的作者寫的總帖子的數量
- 20. 從幾個1位ALU製作一個4位ALU
- 21. 給定位置的全局唯一整數ID(順序)
- 22. 位操作修改位,包括數
- 23. 使用位操作說,如果一個無符號整數,可以在形式表達2^n-1個
- 24. java位操作
- 25. 位操作
- 26. 位C操作
- 27. 位操作?
- 28. 位操作AND
- 29. Numpy位操作
- 30. 位操作符
那麼,這功課呢? (我只問,因爲這是你問的這種類型的第二個問題) – quasiverse 2011-03-31 10:06:22
不...繼續回答它;;) – garima 2011-03-31 10:13:27
讓我們說,我們有n = 0x11001101,x是次最小。這意味着x大於n && x是所有更大中最小的&& x與x具有相同的1位數。這是我的規則從n更改爲x:將最後的0更改爲1;如果它右邊有1位,則將最接近最後0的那個更改爲0;否則,將第一個0改爲1,將第一個0的最接近的1改爲0.我可以在這裏看到遞歸的方式。但仍不清楚基本規律或理論。 – SecureFish 2011-07-28 22:23:49