位操作實例解析及數學之美初見

今天我所認識到的數學之美

通過操作符及位運算的掌握,再結合了部分的習題練習。我對是或不是這兩個概念的印象越發深刻。正如計算機的二進制一樣。是就是1,不是就是0。它不存在其他的結果,它(基本 )不會有模棱兩可的第三種中立性判斷(不耍心眼,不鬧脾氣,是或不是直接表現出來 !)。

我們可以結合學習過的運算符,如認爲的改變這個結果,就比如& | ^ ~等,來對一個數據內部的bit位進行小小的改變,進而影響這個數據的真實值。也可以用&& || !來對多種結果進行綜合考慮進而影響大局。

因爲大一所學的《離散數學》這麼課程,我個人也就對這種簡單的邏輯運算比較熟悉,但是經過練習後發現,很多複雜的文字類型的邏輯題,在我們能夠正確的將解題關鍵條件用c語言翻譯出來後,結合一定的分支或選擇語句,就可以利用計算機解出一道比較複雜的邏輯題。而且,計算機比我們人動腦算的要快,在翻譯條件完全正確的前提下計算結果甚至不會出現錯誤!

都說計算機是以模擬人的行爲(思考)來實現問題的解決的。單純的從這一小點上來看,這幾個小小的邏輯運算符既已經大致(用詞不準確,請見諒)如何模仿人腦對事物的思考判斷。
如果我們將待解決的問題的規模放大,再放大。人腦就會很難對問題進行高效的解決(就算可以,相比計算機來說,在大致解決思路正確的前提下,計算機要快要準)。但是,計算機的配置是可以擴容的,我們可以隨着問題規模的擴大而使計算機的配置擴大,由程序員來確定大致的解決方法,將無趣煩雜的解題過程交給計算機來解決,從而提高效率。

在這個過程中,程序員將解決辦法交給計算機時,就需要使用一種工具——計算機語言。

而計算機語言,需要能夠在一定程度上承載住解決問題的具體實現。
然而大多數實現過程中都或多或少會使用到數學,並且數學在計算機解決問題的過程中不可缺少的。
(當然你不可能讓計算機去寫高考作文或者閱讀理解)
所以個人理解,

  • 解決問題的工具是計算機語言!
  • 計算機語言是使用者邏輯或算法的載體
  • 多種算法或邏輯集合使用再借助計算機高效準確的運算屬性最終實現問題的解決

按位運算

- 打開位(設置位 )(特定位置1)

任何數與1取或運算的結果都是1
邏輯上的運算和按位運算在本質上是相同的
所以如果需要給某個數的特定位置1.就需要在這一個bit位上對該數按位運算|1。

xxxxxx0xxxxx | xxxxxxx1xxxxx —>xxxxxxx1xxxxx

但是如何準確地對某一個位進行該操作呢,這裏就需要運用到位移操作符。
規律發現

如果需要對某數y的二進制碼中的第x個bit位進行置1操作。

y = y | (1<<x)

(位移運算左移無腦補0)

3關閉位(清空位)(特定位置0)

任何數與0取邏輯與運算的結果都是0

任何數與1取邏輯與運算的結果都是這個數本身

如果想給某個數的某一個bit位上置0,我們可以對這個比特位與0進行按位取與。
但是如何精確到這個bit位上,但是又不影響其他位上的數據呢?

結合上述性質。我們發現,我們如果需要給某位置0,需要對其餘各個bit位上進行按位與1取與運算,對目標位進行按位 與0取與運算。只有這樣才能保證數據最終符合要求。
但是如何確定這個數呢?
題目只給了對第x位進行置零操作,(跟着感覺走)我們發現,先1左移x位在對這個數進行按位取反操作,就得到了符合要求的工具操作數(這個數感覺就是個開關類的工具)

如果需要對某數y的二進制碼中的第x個bit位進行置0操作。

y = y & (~(1<<x))

2切換位(特定位取反).

0與1取邏輯異或運算的結果都是1

1與1取邏輯異或運算的結果都是0

計算機中只有0和1兩種數

由此可見,再計算機中,如果要實現某一個位進行狀態切換,只需要對這個位上的數和1進行按位異或就可以實現狀態的改變。
同理結合左移操作

如果需要對某數y的二進制碼中的第x個bit位進行切換狀態的操作。

y = y ^ (1<<x)

1 檢查位(檢查某個位或某個數的0或1的個數)

在c語言的學習中。我們肯定遇到過一道這樣的練習題。

請確定一個數x的二進制中有幾個1?

膜2,除2,循環判定,一氣呵成!別問我爲什麼,就是一個字,帥!

這個方法有錯嗎,沒錯,一點錯都沒有。它是利用膜2 除2外加循環,來計算出二進制的每一位上相對應的數字。
但是!!!!計算機中的所有數都是二進制形式的,我們爲什麼不直接去二進制中一個一個找呢?算多麻煩!(計算機中所有數據都是以補碼形式儲存的,有利於cpu的運算以及避免大小1問題)(c會自動將數據轉換成補碼)(以上說法可能不準確,但是計算機中絕對不是存放數據的二進制數)
既然二進制有了,我們就可以直接再二進制中按位一個一個的找。(循環判斷變量++這個我拿手,但這個不是最優的!)
優化算法!

while (x)
	{
		x = x&(x - 1);
		cont++;

	}

二進制位上有幾個1就做幾次循環
x = x&(x - 1);算法優化的關鍵
例如
(0000 1000)x = x ( 0000 1010 ) & (x-1) (0000 1001) cont++ while條件成立
(0000 0000)x=x(0000 1000) &(x-1) (0000 0100) cont++ while條件不成立

總結

無腦ruaruarua!
某位置1,無腦對y = y & (1<<x)
某位清,無腦 y = y & (~(1<<x))
某位切換,無腦y = y ^ (1<<x)
判1判0,核心x = x&(x - 1)

離散數學的溫故知新(霧)

5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果
A選手說:B第二,我第三;
B選手說:我第二,E第四;
C選手說:我第一,D第二;
D選手說:C最後,我第三;
E選手說:我第四,A第一;
比賽結束後,每位選手都說對了一半,請編程確定比賽的名次。

你看着不直白的說話方式,你看着又有點傲嬌的成立條件,這要是放在離散數學的期末考試卷子上,我妥妥的估計要掛科。
不是我不會,是因爲我懶!
我會用枚舉的方法一個一個的試,直到最後滿足條件。
但是那樣的話,要試好多次,且每次得出來的結果都要記錄卡下來。這誰記得住啊。
而且,考試畢竟是考試,沒有過程光有答案估計也不會給我分,所以我就懶得寫了

但是現在挺好,我有計算機了,這東西比腦子好使多了。窮舉就交給他了,記錄也交給他了,只要過程合理,結果正確,我就算是完成任務了。
所以,我只用使用語言,將成立條件翻譯出來就行了!
(代碼我就不上了!)(c語言沒有邏輯異或!)
由此可見,只要對比較複雜的數學問題,(利用數學)確立一個合理的解決思路,最後解決的過程及運算,都交給計算機這個機器去完成。
由此可見,數學是編程中不可忽視的。

(嘮嘮叨叨,屁話賊多,你到底想說個啥)

我今年大二,去年高數掛了,離散中等,現代及格線邊邊上。我是學計算機的,我現在有點後悔了。

如果有學弟學妹看到這篇博客,我希望你們可以看到這句話。

好好學數學!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章