設機器字長w
ww位元,u∣w
,w=u
cu|w,w = uc
u∣w,w=
uc。將w
ww分為c
cc個連續長度為u
uu位元的區間,稱為u
uu區間。實現操作:對於乙個機器字x
xx,如果乙個u
uu區間非0,則將區間最右bit置1,其餘為0。要求演算法時間為o(1
)o(1)
o(1)
考慮異或操作。對於乙個u
uu位的二進位制數x
xx,當且僅當x=0
x = 0
x=0的時候,f(x
)=((
not(
x))+
1)
f(x) = ((not(x))+1)
f(x)=(
(not
(x))
+1)會向第u+1位進製。其中not
(x
)not(x)
not(x)
表示對x
xx取反
於是,當c=1
c=1c=
1的時候,即u
uu區間就是字長時,通過執行f(x
)f(x)
f(x)
後c fcf
cf位是否為1,可判斷x
xx是否為0。
但是,當c
>
1c>1
c>
1時,我們就必須考慮上述的「進製操作」能否正常的儲存下來,以便於我們判零。
不妨先考慮c=2
c=2c=
2時的情況,設高位址的u
uu區間為x
xx,低位址的u
uu區間為yyy,
若y
yy不產生進製,我們就無需考慮進製之後的問題;
若y
yy產生了進製,那麼什麼時候這種進製可以在x
xx的最低位儲存下來呢?顯然是x
xx的最低位為0時(取反再加1後,該位為0)。
如果x
xx的最低位不為零怎麼辦?我們可以先處理它,得到最低位對答案的貢獻,記為ans
1ans_1
ans1
。然後將最低位統統清零,再通過f(x
)f(x)
f(x)
來判零。記此時的答案為ans
2ans_2
ans2
可是又產生了乙個新的問題:如果乙個區間的值就是00…01,在最低位清零之後,f(x
)f(x)
f(x)
判零法會失效。怎麼辦?
我們先列舉某個區間在兩次答案中的所有可能情況sss=
首先,(零,非零)不會出現,可以直接排除;
其次,對於(零,零) 和 (非零,非零),判零法是有效的;
最後,出現(非零,零),說明判零法失效,我們需要消除這種影響。
對於c
>
2c>2
c>
2的情況可以直接推廣。
分析完解題思路後,假設我們得到的w
ww位二進位制數是xxx,
我們如何來得到ans
1ans_1
ans1呢?
對x
xx按位與乙個二進位制常數c1=
((0)
u−11
)c(2
)c_1=1)^c}_
c1=((
0)u−
11)c
(2)
,(i
ii的k
kk次冪表示連續的k
kk個iii)
常數中的1用來「儲存」我們需要的位,如果那一位是1,則會被記錄到ans
1ans_1
ans1
的相應位中,否則就不會被記錄下來。
之後,如何消除最低位呢?
對x
xx按位與乙個二進位制常數c2=
((1)
u−10
)c(2
)c_2=0)^c}_
c2=((
1)u−
10)c
(2)
,並替換x
xx此時,常數中的0負責對相應的位清零
再然後,對f(x
)f(x)
f(x)
的結果右移u
uu位就可以得到ans
2ans_2
ans2了
注:最高位的進製(如果有),儲存在cf中,需要採用帶進製迴圈右移一位取出cf到最高位,之後再採用邏輯右移對最高位補零
乙個小問題
error c2679 binary no operator defined which takes a right hand operand of type class smanip int or there is no acceptable conversion 除錯了好久,就是找不出問題在哪。...
乙個小問題。
drop table student create table student sno number 10 sname varchar2 10 sage int insert into student values 1,aa 21 insert into student values 1,aa 21...
shtml的乙個小問題
新建body.shtml 其 如下 我組成身體 然後建它引用的兩個 html 頁面,head.html 的 如下 我組成頭部 foot.html 和這個問題無關就不貼了,然後瀏覽器訪問 body.shtml 得到的頁面如下圖 恩,沒毛病!等等,怎麼在 我組成頭部 前面有個空格?檢視響應正文我們 看到...