[問題] x+=x&-x 是什麼意思?

看板C_and_CPP (C/C++)作者 (Bessiozs)時間8年前 (2018/04/28 11:00), 8年前編輯推噓9(9012)
留言21則, 11人參與, 7年前最新討論串1/3 (看更多)
最近看到程式碼 有人這樣寫 for(;x>=0; x+=x&-x) 但不太了解後面的 x+=x&-x是什麼意思 試著寫了 for(;x>=0; x+=x&-x) { cout<<x<<endl; } 跑的結果都是從 x開始 然後變成2的指數 所以想問 x+=x&-x是要怎樣解讀? 另外想問一下 int a[1<<10] 這樣跟 a[10000000000]是一樣的嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.91.107 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1524884446.A.E1E.html

04/28 11:32, 8年前 , 1F
不要這樣寫
04/28 11:32, 1F

04/28 11:43, 8年前 , 2F
最後那個當然不對,二進位不是十進位
04/28 11:43, 2F

04/28 11:49, 8年前 , 3F
x+=x&-x ←等於加上 x 最右邊 bit 的那個值唷
04/28 11:49, 3F

04/28 11:49, 8年前 , 4F
有點「線段樹」的味道~~
04/28 11:49, 4F

04/28 11:50, 8年前 , 5F
int a[1 << 10] ← int a[1024] 的意思唷, 2^10 = 1024
04/28 11:50, 5F
了解,以為1<<10 是指往左邊移動10個位置,謝謝您的解釋

04/28 11:57, 8年前 , 6F
BIT吧
04/28 11:57, 6F

04/28 12:17, 8年前 , 7F
你把1~8的 x&-x 用bit表示就知道為什麼了
04/28 12:17, 7F

04/28 12:18, 8年前 , 8F
這種寫法其實不用去鑽研,除非你很常用,不然一週後你就忘了
04/28 12:18, 8F

04/28 12:18, 8年前 , 9F
再來就是別人也不好讀
04/28 12:18, 9F
※ 編輯: zxcv14011 (140.113.91.107), 04/28/2018 18:53:16

04/28 20:20, 8年前 , 10F
他在寫binary index tree(fenwick tree)吧
04/28 20:20, 10F

04/29 03:09, 8年前 , 11F
前面那格應該是x<=n吧 另外其實我也常常這樣寫@@
04/29 03:09, 11F

04/30 09:01, 8年前 , 12F
這種寫法還是有其必要性吧?而且其實蠻基本的...
04/30 09:01, 12F

04/30 18:41, 8年前 , 13F
基本與否是一回事, 哪裡有必要性?沒有這種語法的語言多
04/30 18:41, 13F

04/30 18:41, 8年前 , 14F
得是, 難道這些語言都有根本缺陷做不了正事嗎?
04/30 18:41, 14F

04/30 22:02, 8年前 , 15F
是沒有必要性 但這樣寫精簡很多 可讀性也不差
04/30 22:02, 15F

05/01 11:44, 8年前 , 16F
不要看太少又不想動腦就罵別人可讀性低
05/01 11:44, 16F

05/01 11:45, 8年前 , 17F
bitwise operator在driver應用上非常常見
05/01 11:45, 17F

05/01 11:46, 8年前 , 18F
而且很多時候往往都是效率上的需求,會具有必要性
05/01 11:46, 18F

05/01 11:47, 8年前 , 19F
沒有這類語法的語言,應該不會有人想用在driver上
05/01 11:47, 19F

05/01 11:48, 8年前 , 20F
有興趣專研bitwise op的人,推薦去看Hacker's Delight
05/01 11:48, 20F

05/08 02:10, 7年前 , 21F
感謝分享
05/08 02:10, 21F
文章代碼(AID): #1Qu-FUuU (C_and_CPP)
文章代碼(AID): #1Qu-FUuU (C_and_CPP)