/* Ċ * ĠCopyright Ġ 2 0 1 9 Ġpeng u in _ ww y < 9 4 0 3 7 5 6 0 6 @ qq . com > Ċ * Ċ * ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġcom . ded x . utils Ċ Ċ import Ġjava . lang . Exception Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . math . max Ċ Ċ class ĠBit Array Out Index Ġ: ĠException Ġ{ ĊĠĠĠ Ġconstructor ( message : ĠString ) Ġ: Ġsuper ( message ) ĊĊĠĠĠ Ġconstructor ( message : ĠString , Ġcause : ĠThrowable ) Ġ: Ġsuper ( message , Ġcause ) Ċ } Ċ Ċ class ĠBit Array ( val Ġsize : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġfull Ġ= Ġsize Ġ% ĠByte . SIZE _ BITS Ġ== Ġ 0 ĊĠĠĠ Ġval Ġ_ array Ġ= ĠArray < Byte >(( size Ġ/ ĠByte . SIZE _ BITS ) Ġ+ Ġwhen Ġ( full ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ 1 ĊĠĠĠ Ġ}) Ġ{ Ġ 0 Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsub ( b 1 : ĠBit Array , Ġb 2 : ĠBit Array ): ĠBit Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠBit Array ( b 1 . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( offset Ġin Ġb 1 ._ array . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ< Ġb 2 ._ array . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġb 1 ._ array [ offset ]. toInt () Ġand Ġb 2 ._ array [ offset ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ offset ] Ġ= Ġ( b 1 ._ array [ offset ]. toInt () Ġ- Ġtmp ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ offset ] Ġ= Ġb 1 ._ array [ offset ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġand ( b 1 : ĠBit Array , Ġb 2 : ĠBit Array ): ĠBit Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmax ( b 1 . size , Ġb 2 . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠBit Array ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġmax ( b 1 ._ array . size , Ġb 2 ._ array . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( i Ġ< Ġb 1 ._ array . size ) Ġ&& Ġ( i Ġ< Ġb 2 ._ array . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ i ] Ġ= Ġ( b 1 ._ array [ i ]. toInt () Ġand Ġb 2 ._ array [ i ]. toInt ()). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ i ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmerge ( b 1 : ĠBit Array , Ġb 2 : ĠBit Array ): ĠBit Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata List Ġ= ĠArrayList < Bit Array >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata List . add ( b 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata List . add ( b 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmerge ( data List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmerge ( data List : ĠList < Bit Array >): ĠBit Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data List . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata List [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠBit Array ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġdata List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠBit Array . or ( result , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġor ( b 1 : ĠBit Array , Ġb 2 : ĠBit Array ): ĠBit Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmax ( b 1 . size , Ġb 2 . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠBit Array ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġmax ( b 1 ._ array . size , Ġb 2 ._ array . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( i Ġ< Ġb 1 ._ array . size ) Ġ&& Ġ( i Ġ< Ġb 2 ._ array . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ i ] Ġ= Ġ( b 1 ._ array [ i ]. toInt () Ġor Ġb 2 ._ array [ i ]. toInt ()). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġb 1 ._ array . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ i ] Ġ= Ġb 1 ._ array [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ._ array [ i ] Ġ= Ġb 2 ._ array [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset True ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBit Array Out Index (" Set Ġ$ index Ġout Ġof Ġlength Ġ$ size ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġindex Ġ/ ĠByte . SIZE _ BITS ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġindex Ġ% ĠByte . SIZE _ BITS ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ_ array [ base ]. toInt () ĊĠĠĠĠĠĠĠ Ġ_ array [ base ] Ġ= Ġ( tmp Ġor Ġ( 0 x 1 Ġshl Ġoffset )). to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset False ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBit Array Out Index (" Set Ġ$ index Ġout Ġof Ġlength Ġ$ size ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġindex Ġ/ ĠByte . SIZE _ BITS ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġindex Ġ% ĠByte . SIZE _ BITS ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ_ array [ base ]. toInt () ĊĠĠĠĠĠĠĠ Ġ_ array [ base ] Ġ= Ġ( tmp Ġand Ġ( 0 xFF Ġxor Ġ( 0 x 1 Ġshl Ġoffset ))). to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBit Array Out Index (" Set Ġ$ index Ġout Ġof Ġlength Ġ$ size ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġindex Ġ/ ĠByte . SIZE _ BITS ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġindex Ġ% ĠByte . SIZE _ BITS ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ 0 x 1 Ġshl Ġoffset ĊĠĠĠĠĠĠĠ Ġif Ġ((_ array [ base ]. toInt () Ġand Ġtmp ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsub ( other : ĠBit Array ) Ġ= ĠBit Array . sub ( this , Ġother ) ĊĊĠĠĠ Ġfun Ġand ( other : ĠBit Array ) Ġ= ĠBit Array . and ( this , Ġother ) ĊĊĠĠĠ Ġfun Ġor ( other : ĠBit Array ) Ġ= ĠBit Array . or ( this , Ġother ) ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ array [ i ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġequal ( data : ĠArray < Byte >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ array . size Ġ!= Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( offset Ġin Ġ_ array . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ array [ offset ] Ġ!= Ġdata [ offset ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ array . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"{} " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġindex List Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( offset Ġin Ġ_ array . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ 1 Ġshl Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((_ array [ offset ]. toInt () Ġand Ġtmp ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex List . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex List . add ( offset Ġ* Ġ 8 Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"{ ${ index List . join ToString (" Ġ") }}" ĊĠĠĠ Ġ} Ċ } Ċ