紅綠燈問題(位元運算)

來源:互聯網
上載者:User
考慮一十字路口,每個路口有三盞紅綠燈,分別指明能否左轉、右轉及直行。共有12盞,現在要為它編寫一個控製程序,不管這程式的功能怎樣,首先需要將紅綠燈的狀態轉化為數字,因為電腦只知道數字。所以用3個數字分別表示某路口的三盞紅綠燈,因此每個紅綠燈的狀態由一個數字來表示,假設紅燈為0,綠燈為1(不考慮黃燈或其他情況)。
    後來忽然發現,其實也可以用一個數字表示一個路口的三盞紅綠燈狀態,如用110表示左轉綠燈、直行綠燈而右轉紅燈。上面的110是一個十進位數字,它的每一位實際都可以為0~9十個數字,但是這裡只應用到了兩個:0和1,感覺很浪費。故選擇位元來表示,還是110,但是是位元了,轉成十進位數為6,即使當為111時轉成十進位數也只是7,比前面的110這個十進位數小多了,節約了……??什嗎??
下面繼續上面的思考。使用了110這個位元來表示三盞紅綠燈的狀態,那麼現在要知道110這個數字代表左轉紅綠燈的什麼狀態。以數位第三位表示左轉,不過電腦並不知道這個,因此如下:110&100.這個運算式的傳回值是100,非零,邏輯真。假設某路口的狀態為010,則同樣的010&100,傳回值為0,邏輯假。因此使用“&”操作符可以將位元中的某一位或幾位的狀態提取出來。所以我們要瞭解一個數字代表的紅綠燈狀態中的左轉紅綠燈是否綠燈時,只需讓它和100相與即可。
    現在要保持其他紅綠燈的狀態不變,僅僅使左轉紅綠燈為綠燈,如目前狀態為010,為了使左轉紅綠燈為綠燈,值應該為110,這可以通過010|100做到。如果目前狀態是001,則001|100為101,正確——直行和右轉的紅綠燈狀態均沒有發生變化。因此使用“|”操作符可以給一個位元中的某一位或幾位設定狀態,但只能設定為1,如果想設定為0,如101,要關掉左轉的綠燈,則101&~100,傳回值為001.
    上面一直提到的路口紅綠燈的狀態實際編寫時可以使用一個變數來表示,而上面的100也可以用一個標識符來表示,如state&TS_LEFT,就可以表示檢查變數state所表示的狀態中的左轉紅綠燈的狀態。
    上面的這種方法被大量地運用,如建立一個視窗,一個視窗可能有二三十個風格,則通過上面的方法,就可以只用一個32位長的位元字就表示了視窗的風格,而不用去弄二三十個數字來分別代表每種風格是否具有。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.