klion26
klion26's blog
C++博客
|
首頁
|
發新隨筆
|
發新文章
|
聯系
|
聚合
|
管理
隨筆:71 文章:0 評論:17 引用:0
POJ 2453 瘋狂的位運算
這題是寧波區域賽的熱省賽中的一題……
后來偶然發現時POJ上的,而且有人用位運算搞過了,于是就去學位運算,通過Matrix67大牛的三篇文章學的,第四篇還沒看,(想看的可以去搜下Matrix67或者去我前面的文章找下,應該是sgu那篇,可以找到鏈接)
這題可以這么想,比如原數x=0101110的下一個是01100011,你可以這樣想,以要比原數大,必須把原數的最右邊的一段1(連續的,如果只有一個的,就是一個)變成0,把這段1的右邊的第一個0變成1,然后再在所得的數的最右邊補1,知道1的位數一樣。
這樣的話,我們就可以這樣做了
設原數為x
然后t = x + (x & -x);//(x & -x) 取x的最右邊的一個1,因為"把原數的最右邊的一段1變成0"可以加上最右邊一個1
接下來就是補1的過程了,當然可能不用補
好吧我們用一個函數得到x(10進制)在2進制表示下的1的個數(如果有看不懂的,建議先看下Matrix67大牛的位運算在看,當然到那個時候基本你自己也可以寫了,不必要看我的了,呵呵)
函數如下
get
1
int
get
(
int
n)
2
{
3
n
=
(n
&
0x55555555
)
+
((n
>>
1
)
&
0x55555555
);
4
n
=
(n
&
0x33333333
)
+
((n
>>
2
)
&
0x33333333
);
5
n
=
(n
&
0x0F0F0F0F
)
+
((n
>>
4
)
&
0x0F0F0F0F
);
6
n
=
(n
&
0x00FF00FF
)
+
((n
>>
8
)
&
0x00FF00FF
);
7
n
=
(n
&
0x0000FFFF
)
+
((n
>>
16
)
&
0x0000FFFF
);
8
return
n;
9
}
這樣我們就基本是完成了。具體代碼如下,個人建議先自己想,實在想不出來之后再看我的代碼
CODE
1
/**/
/*
2
ID:Klion
3
PROG:POJ_2453
4
LANG:C++
5
*/
6
#include
<
iostream
>
7
using
namespace
std;
8
int
get
(
int
n)
9
{
10
/**/
/*
11
這里是錯的,因為這樣的話,會錯位,具體可以自己
12
手動算一下,可以用這個數11010011(211)
13
n = (n & 0xAAAAAAAA) + ((n >> 1) & 0xAAAAAAAA);
14
n = (n & 0xCCCCCCCC) + ((n >> 2) & 0xCCCCCCCC);
15
n = (n & 0xF0F0F0F0) + ((n >> 4) & 0xF0F0F0F0);
16
n = (n & 0xFF00FF00) + ((n >> 8) & 0xFF00FF00);
17
n = (n & 0xFFFF0000) + ((n >> 16) & 0xFFFF0000);
18
*/
19
n
=
(n
&
0x55555555
)
+
((n
>>
1
)
&
0x55555555
);
20
n
=
(n
&
0x33333333
)
+
((n
>>
2
)
&
0x33333333
);
21
n
=
(n
&
0x0F0F0F0F
)
+
((n
>>
4
)
&
0x0F0F0F0F
);
22
n
=
(n
&
0x00FF00FF
)
+
((n
>>
8
)
&
0x00FF00FF
);
23
n
=
(n
&
0x0000FFFF
)
+
((n
>>
16
)
&
0x0000FFFF
);
24
return
n;
25
}
26
int
main(
void
)
27
{
28
int
x;
29
int
t,b,c;
30
while
(scanf(
"
%d
"
,
&
x),x)
31
{
32
c
=
x
&
-
x;
33
t
=
x
+
c;
34
b
=
get
(x)
-
get
(t);
35
t
=
t
|
((
1
<<
b)
-
1
);
36
printf(
"
%d\n
"
,t);
37
}
38
return
0
;
39
}
40
發表于 2010-05-24 19:31
Klion
閱讀(342)
評論(0)
編輯
收藏
引用
所屬分類:
POJ
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
相關文章:
頂嵌杯--D 序列
頂嵌杯--C 字符串替換
頂嵌杯--B 取模
頂嵌杯--A 分數加減法
POJ 1273 網絡流入門題 ---EK算法
POJ 1014 && 1742 多重背包的O(VN)解法
POJ 3070
POJ 1661 Help Jimmy
POJ_3321 樹狀數組
POJ 3067 樹狀數組
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
<
2010年7月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(1)
給我留言
查看公開留言
查看私人留言
隨筆分類
(99)
DP(7)
(rss)
Linux學習之路(11)
(rss)
POJ(18)
(rss)
USACO(27)
(rss)
計算機專業(3)
(rss)
計算幾何
(rss)
數據結構&字符串(14)
(rss)
數學(8)
(rss)
搜索(4)
(rss)
貪心(1)
(rss)
圖論(4)
(rss)
雜(2)
(rss)
隨筆檔案
(71)
2010年12月 (7)
2010年11月 (11)
2010年9月 (6)
2010年8月 (12)
2010年7月 (12)
2010年6月 (6)
2010年5月 (15)
2010年4月 (2)
好友鏈接
我的獨立域名
我的獨立域名
搜索
最新評論
1.?re: SQL Server 2005端口號設置
在程序中的數據庫連接字符串也應該做相應的更改,怎么操作啊?
--peijian
2.?re: SQL Server 2005端口號設置
如果是在本機,客戶端IP還是寫localhost嗎?
--的
3.?re: VMware 安裝RedHat9時光盤無法掛載的問題[未登錄]
嗯 收獲了 謝謝
--jz
4.?re: Ubuntu死機那點事
確實有用,我用到第3點,就可以了。
謝謝!
--Annie
5.?re: POJ_1195 二維樹狀數組
@yp
能有這效果,我表示非常高興
--klion26
閱讀排行榜
1.?Ubuntu死機那點事(4802)
2.?SQL Server 2005端口號設置(4721)
3.?POJ 1014 && 1742 多重背包的O(VN)解法(2948)
4.?三種簡單博弈問題的簡單介紹(2884)
5.?HDU_1907&2509 博弈(2298)
評論排行榜
1.?SQL Server 2005端口號設置(6)
2.?三種簡單博弈問題的簡單介紹(2)
3.?回歸CPP Blog(2)
4.?《自己動手寫操作系統》第一步(2)
5.?POJ_1195 二維樹狀數組(2)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Klion
久久夜色精品国产噜噜麻豆
|
亚洲综合熟女久久久30p
|
无码精品久久一区二区三区
|
理论片午午伦夜理片久久
|
久久久久久曰本AV免费免费
|
久久av无码专区亚洲av桃花岛
|
狠狠色婷婷综合天天久久丁香
|
久久综合九色综合久99
|
大美女久久久久久j久久
|
久久精品国产久精国产果冻传媒
|
久久综合欧美成人
|
91麻豆国产精品91久久久
|
精品久久久久久久
|
久久久无码精品亚洲日韩京东传媒
|
69久久精品无码一区二区
|
四虎亚洲国产成人久久精品
|
精品久久久久久久
|
久久99精品久久久久久hb无码
|
色综合久久天天综线观看
|
欧美777精品久久久久网
|
人妻无码久久一区二区三区免费
|
伊人色综合久久天天网
|
久久久久这里只有精品
|
精品国产99久久久久久麻豆
|
国产精品久久久久一区二区三区
|
无码人妻久久一区二区三区免费丨
|
久久狠狠一本精品综合网
|
色偷偷888欧美精品久久久
|
国产V亚洲V天堂无码久久久
|
久久免费看黄a级毛片
|
精产国品久久一二三产区区别
|
精品久久人人做人人爽综合
|
亚洲国产成人精品女人久久久
|
人妻丰满AV无码久久不卡
|
无码8090精品久久一区
|
久久精品国产精品亚洲
|
精品久久久无码中文字幕
|
九九久久精品无码专区
|
人妻精品久久久久中文字幕
|
亚洲а∨天堂久久精品9966
|
久久久久久久97
|