回答
明年很高,你可以使用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. 給定一個16位整數,比較每個四位並輸出最大值
- 9. C++中的64位整數的按位(Bitshift)操作
- 10. 在特定數量的位置上僅移位整數中的1位
- 11. 如何使用位操作來查找第5位,並返回整數中的1位數
- 12. 位操作轉換爲整數
- 13. 改變一個32位的整數的特定位中的Java
- 14. 如何在一個字節整數中存儲2位,1位,1位和4位值
- 15. 將64位整數中的每一位比較爲一個32位整數
- 16. 整數與mysql中的固定位數
- 17. 64位上的按位與長整數與整數的性能
- 18. iPhone 4和5上的64位整數的位板按位操作?
- 19. 位向量建立一個字節數組 - 瞭解位操作
- 20. 位操作:修改32位整數以包含子串
- 21. 32位體系結構中的64位操作數的操作?
- 22. 反向位與操作
- 23. 位與操作不明確
- 24. 通過位操作將整數分解爲整數數組
- 25. 使用Python 3,如何將8位無符號整數與高位1一起寫入(1個字節)?
- 26. JavaScript的:轉換一個52位整數,20位和32位整數
- 27. 速度:四個整數或一個整數與許多操作
- 28. 按位操作的操作
- 29. 如何表示一個多位數的整數?例如代表1作爲01
- 30. 與負操作數的Java按位移位運算符
那麼,這功課呢? (我只問,因爲這是你問的這種類型的第二個問題) – 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