, k5 q4 A; y9 Y. @4 g- l/ a( ^
' j. z: k! `! _) j学计算机的朋友刚开始学习时都要接触进制之间的转换,二进制、十进制、八进制、十六进制等,这个是很枯燥的,转来转去
' v# \0 \$ }* R就转蒙圈了,别蒙别蒙,今天咱们一个一个搞定,看看二进制和十进制之间如何相互转换的。这个算法时间复杂度是O(1),没& x+ q: Y) H& `/ E* P! o
想到吧!我想到的算法是,将n一直除2直到n变为0,如果途中出现余数不为0则说明n不是2的幂。
0 n& O% _4 G+ s- p这样算法时间复杂度是O(log2(n))。可谁知利用二进制二进制位运算后,立马变为O(1),真是不可思议。为什么会有这种巧妙
* p* `, `6 u# m" `8 v0 o* D; K2 L的算法呢,还是因为二进制数只有0,1两个数码,能进行位逻辑运算。1、二进制转化十进制方式1:
' W. u& ]7 j+ N% [$ s, t% n使用BigInteger类进行十进制数据的构建。二进制和十进制怎么互相转化??) o2 _; t Z& F6 J, ^6 ~
2、二进制转化十进制方式2:. s, U/ V5 w; ^. d
使用Integer.parseInt方法进行二进制转化十进制。二进制和十进制怎么互相转化??5 b" z* S7 F n+ W( C$ T A$ x
3、二进制转化十进制方式3:
+ d7 B! R$ m8 r0 V使用自定义的数学算法规则进行二进制转化十进制。二进制和十进制怎么互相转化??4 W" p) q# _' `$ A, d6 S
4、十进制转化二进制方式1:. C# B, C f! R
使用BigInteger类进行十进制数据的构建并转化为二进制。二进制和十进制怎么互相转化??8 L% L) D' r' |0 s* [: k. Q
5、二进制转化十进制方式2:( A+ W; D6 Q: j2 E' W, e M
使用Integer.parseInt方法进行十进制转化二进制。 一、计算一个数字的二进制中的1的个数int NumberOfOne(int n)" a# Z7 W4 [) p4 E4 c( C- ^0 |
1 ?" {5 H6 t/ S9 e
{7 y% R, V4 W$ H0 [2 U
% y3 O" S G8 _; B* Bint count = 0;
0 Z( o* j& H7 g. |2 k# |+ {( i" t. F2 q+ e/ j! T0 ]6 B
while(n)
- \. A! U3 O; p$ k
: \ @; I" L% y{9 r8 _5 j! A! A2 A
: B2 N6 G1 [: n; L/ y
++count;# {; X5 H; k1 Y% v- E
3 Y# J0 V# t! V0 ?n = n&(n-1);* e6 ], ]" M0 f6 A( G' I5 ?! X
3 _0 ^$ |& I" R. |" H! r6 i
}% \( g: n9 w7 V
( v! @, e4 }& Y/ \return count;" [/ K$ ]5 b t
7 }; {8 n4 I8 `, s9 M; J" J}2 ~2 q. u/ `4 k2 f" Q% _
; Q/ e6 R- c/ S0 w9 f4 o9 c总结分析:把一个整数减去一,再和原整数做与运算,会把最右边的一个1变成0,那么一个整数而二进制表示中有多少个1就
# ?- V. l4 O9 L, n% M% C可以进行多少次这样的操作。
, ~ r' o. n) A/ z; m# @2、用一条语句判断一个整数是不是2的整数次方。分析:一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位
# j8 g. _; c+ n* ~1 |+ }1 B, j# L是1,而其他的所有的位是0.; G2 b1 n7 i N. A/ R. y) N
9 H/ N; y1 c; V0 {& n$ O. c, e$ y3 t$ G3、输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n,分析:第一步求这两个数的异或(^),第二3 s9 f1 b# z. W6 ?4 G9 J. L
部统计异或结果中1的位数。9 o$ `$ E( [4 w
6 O+ {0 r' |/ r. {. l9 U5 J6 b
\5 _6 b; `& W) r |