Integer位操作技巧解析

2021-07-27 04:25:25 字數 2370 閱讀 5695

public

static

inthighestonebit(int i)

畫個圖簡單說明一下算原理,下圖以8為為例,做了左移1,2,4位之後的效果,最終的效果就是在最早出現1的位置後面都是1。

32位的int也是類似的,最終的效果就是從左邊第一位是1開始後面都是1。

負數以補碼形式存在,乙個負數的補碼,就是對應整數的二進位制再取反加一。i和-i總有乙個是正數,假設是i吧,由於兩個數相加是0,在二進位制角度來看,假設i最右邊出現1的位置是k,那麼在相同位置上-i必定也是1,並且-i在k以後的位也是0,這2位相加是0,並且進製1,那麼要是k-1位相加得到0,兩個數字在k-1位上只能是乙個1,另外乙個是0,以此類推,可以得到從左邊第一位開始直到k-1位都是不同的。兩個數進行與運算,只會在k位保留1,其他位都變成0。

public

static

intnumberofleadingzeros(int i)

if (i >>> 24 == 0)

if (i >>> 28 == 0)

if (i >>> 30 == 0)

n -= i >>> 31;

return n;

}

以移動16位為例子,如果左移16位之後是0,那麼前16位都是0,那麼就只要判斷後面16位就可以了。

如果不是0,那麼只要判斷前面16位就可以了,和前面的區別就是,它不需要移位。後面的移位操作,以此類推就可以了。

public

static

intnumberoftrailingzeros(int i)

y = i << 8; if (y != 0)

y = i << 4; if (y != 0)

y = i << 2; if (y != 0)

return n - ((i << 1) >>> 31);

}

和上面的差不多,假設右移16位不等於0,那麼說明只需要判斷右邊16位就可以了。如果等於0,那說明要判斷左邊16位。後面的移位操作,以此類推就可以了。

public

static

intbitcount(int i)

這個演算法也是神乎其技,它的做法是分別計算每2位,每4位,每8位,每16位,每32位..這樣的順序計算.以第一行為例,每2位有4種情況,分別是00,01,10,11, 計算i-((i>>>1) & 01) 可以得到00,01,01,10, 就表示1的個數。

public

static

introtateleft(int i, int distance)

這是基本的移位操作,注意的是右邊要採用算術右移。

public

static

introtateright(int i, int distance)

和上面的一樣,就不再詳述了。

public

static

intreverse(int i)

以第一行為例,它的作用就是兩兩交換,可以通過下圖分析可得。

同理,第二行是每2位交換,第三行是每4位交換,假設原來是b1b2b3b4b5b6b7b8,那麼三行執行後,結果就是b8b7b6b5b4b3b2b1,就是乙個位元組的位進行反轉了。最後一句就是按位元組反轉一下,最終結果就是按位反轉了。

public

static

intsignum(int i)

感覺這個實現有點多此一舉,直接大小判斷很簡單,也很直觀,為什麼不採用?

還是畫個圖說明一下吧。

這個演算法很好理解,第乙個位元組右移24位就跑到第四個位元組去了,第二個位元組右移8位到了第三位,和ff00與運算就抹掉對第四個位元組的影響。後面的就不解釋了。

位操作技巧

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...

位操作技巧

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...

高效位操作技巧

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...