2012-08-30 34 views
4

例如:如何翻轉和顛倒C中的int?

輸入:01011111

輸出:00000101

我知道我可以使用~翻轉了一些,但我不知道好辦法扭轉這種局面。我不確定他們是否可以一起完成。

有沒有人有任何想法?

+0

可能重複(http://stackoverflow.com/questions/9144800/c-reverse-bits-in-unsigned-integer) – Jacob

+0

你知道如何爲數組寫一個反轉函數嗎?這可以用類似的方式完成。 –

+0

可能的重複[在C/C++中最簡單的方法是顛倒一個字節中的位的順序?](http://stackoverflow.com/questions/2602823/in-cc-whats-the-simplest-way-to -reverse-的階的位功能於一個字節) – interjay

回答

8

對於這樣的事情,我建議你去美妙的bit twiddling hacks網頁。下面是從該網頁的解決方案之一:

unsigned char b; // reverse this (8-bit) byte 

b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023; 

的乘法運算創建五個單獨的副本:

3個操作(64位乘法和模量分裂)反向在一個字節中的位的8位字節模式將扇出爲64位值。與操作相對於每個10位的位組選擇位於正確(反向)位置的位。乘法和AND操作複製原始字節的位,使它們每個僅出現在10位集中的一箇中。來自原始字節的位的反轉位置與它們在任何10位集內的相對位置重合。最後一步涉及2^10-1的模數除法,它將每組10位(從位置0-9,10-19,20-29,...)合併到64位值。它們不重疊,因此模數分區下的附加步驟就像是操作一樣。

這種方法是由於富含Schroeppel在編程黑客Beeler, M., Gosper, R. W., and Schroeppel, R. HAKMEM. MIT AI Memo 239, Feb. 29, 1972.

部分和這裏的different solution不使用64位整數:

反轉的位(無64位)

b =((b * 0x0802LU & 0x22110LU)|(b * 0x8020LU & 0x88440LU))* 0x10101LU >> 16;

確保將結果賦值或轉換爲無符號字符以刪除高位中的垃圾。由肖恩·安德森,7月13日提出的,2001年發現輸入錯誤並通過麥克基思,1月3日提供校正,2002.

的[C扭轉無符號整數比特]