精華區beta Programming 關於我們 聯絡資訊
我想請問一下位元遮罩&的原理!為什麼以下會出現非1的數呢? 程式碼如下 void main(void){ int i,mask=0x01; for(i=0;i<10;i++){ for(mask=0x80;mask>=0x01;mask/=2) printf("%d",(i&mask)); printf("\n"); } } 00000000 00000001 00000020 00000021 00000400 4&0x04為什麼是4呢? 00000401 00000420 00000421 00008000 00008001 而以下才是我要結果,全部皆為0 1組成 void main(void){ int i,mask=0x01; for(i=0;i<10;i++){ for(mask=0x80;mask>=0x01;mask/=2) printf("%d",(i&mask)?1:0); printf("\n"); } } 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 -- ☆ 來源:‧華江第一站 Super.Dorm-F2.Nctu.Edu.Tw‧[FROM: create@Super.Dorm-F2] > -------------------------------------------------------------------------- < 發信人: LSDT.bbs@bbs.cs.nthu.edu.tw (徐揚青), 看板: Programming 標 題: Re: 請問位元遮罩(&)的原理? 發信站: 清華資訊(楓橋驛站) (Mon Dec 21 02:52:14 1998) 轉信站: Ptt!news.ntu!bbs.ee.ntu!freebsd.ntu!news.cs.nthu!maple ※ 引述《susubon.bbs@Super.Dorm-F2.NCTU.Edu.Tw (......)》之銘言: > 【 在 TerryLiaw.bbs@Terry.Dorm10.NCTU.edu.tw ( 耶誕夜 作業夜 的大作中提到: 】 > : 啊 ? > : 本來就是 00000100 啊... > : 4 -> 100 > : 0x04 -> 100 > : 100 > : &) 100 > : ------ > : 100 -> 4 > : 你是不是搞錯了 ? :) > 嗯...我的問題是 > 為什麼最後的結果00000400 有4出現,而4為什麼不是1呢? > 因為& 出來旳結果不是應該只有0與1嗎? > 謝謝您的回答 你聽過「電腦裡只有 0 跟 1」嗎,那麼 4 是怎麼出來的,你打的字又是怎麼 出來的? 其實電腦裡連 0 跟 1 都沒有,只有一大堆「有電」與「沒電」的狀態,用這 兩種狀態來代表數字,可以解釋為 0 與 1,把好幾個 0 與 1 解釋為一個數 字,可以表示一部份的整數。 每一個 0 或 1 的狀態叫做一個位元,位元運算是指把資料的每個位元當作獨 立的單位所做的運算,與加減法比較,只是處理的方式不同,並不是資料本身 格式不一樣。做完位元運算的資料,本質上與所有的數字、字元都是一樣的, 你把它當數字印出,它就以那個狀態所代表的數字顯示出來,並不會因為你做 的是位元運算,就以位元的方式列出。同理,在適當的操作下,你也可以把這 個資料以字元、浮點數(實數)、或其他的格式印出,只不過出來的東西會奇 奇怪怪,讓人看得不知所云。 -- ************** 把悲和喜寫一篇永恆的古典 滄桑一生再短暫也無怨 -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: DORM-fw.isu.edu.tw > -------------------------------------------------------------------------- < 發信人: fat.bbs@bbs.ee.nthu.edu.tw (快口試了), 看板: Programming 標 題: Re: 請問位元遮罩(&)的原理? 發信站: ☆清華電機☆ (Mon Dec 21 10:18:36 1998) 轉信站: Ptt!news.ntu!ctu-gate!news.nctu!newsfeed.nthu!news.ee.nthu!star ==> 在 susubon.bbs@Super.Dorm-F2.NCTU.Edu.Tw (......) 的文章中提到: > 【 在 fat.bbs@bbs.ee.nthu.edu.tw (快口試了) 的大作中提到: 】 > : ^ > : 00000100&00000100結果就是00000100啊,所以是4 > 我想要知道的是原理,結果由程式run出即可知... > 為什麼不是00000100而是00000400這樣的結果代表了什麼 > 謝謝! 100轉成十進位就是4,這就是原理 -- ※ Origin: 清華電機 ◆ From: thccy14.oz.nthu.edu.tw > -------------------------------------------------------------------------- < 發信人: fat.bbs@bbs.ee.nthu.edu.tw (快口試了), 看板: Programming 標 題: Re: 請問位元遮罩(&)的原理? 發信站: ☆清華電機☆ (Mon Dec 21 10:19:47 1998) 轉信站: Ptt!news.ntu!bbs.ee.ntu!freebsd.ntu!news.cs.nthu!news.ee.nthu!star ==> 在 susubon.bbs@Super.Dorm-F2.NCTU.Edu.Tw (......) 的文章中提到: > : 沒錯呀. 4 & 0x04 就是 4 呀. > : 4 -> 0x04 -> 0000000000000100 > : 0000000000000100 > : & 0000000000000100 > : ----------------------------------- > : 0000000000000100 > : [deleted] > 請問以上的算法為什麼下面的0000000000000100 要向左shift兩格 > 我對於&只知道可以萃取出我們想要的其中一個bit,其它的一無所知, > 請再詳細說明,謝謝您! > 為什麼4&0x04是00000400而非00000100呢? 應該沒有shift才對 一直忘了講了,&代表bit and -- ※ Origin: 清華電機 ◆ From: thccy14.oz.nthu.edu.tw > -------------------------------------------------------------------------- < 發信人: fat.bbs@bbs.ee.nthu.edu.tw (快口試了), 看板: Programming 標 題: Re: 請問位元遮罩(&)的原理? 發信站: ☆清華電機☆ (Mon Dec 21 10:23:52 1998) 轉信站: Ptt!news.ntu!bbs.ee.ntu!freebsd.ntu!news.cs.nthu!news.ee.nthu!star ==> 在 susubon.bbs@Super.Dorm-F2.NCTU.Edu.Tw (......) 的文章中提到: > 【 在 TerryLiaw.bbs@Terry.Dorm10.NCTU.edu.tw ( 耶誕夜 作業夜 的大作中提到: 】 > : 啊 ? > : 本來就是 00000100 啊... > : 4 -> 100 > : 0x04 -> 100 > : 100 > : &) 100 > : ------ > : 100 -> 4 > : 你是不是搞錯了 ? :) > 嗯...我的問題是 > 為什麼最後的結果00000400 有4出現,而4為什麼不是1呢? > 因為& 出來旳結果不是應該只有0與1嗎? > 謝謝您的回答 您原來的程式是兩層迴圈,也就是每做一次i&mask 只會得出一個阿拉伯數字 4這個數字是由00000100&00000100而來(此時i, mask都是00000100) and後為00000100,轉成十進位後是4沒錯 -- ※ Origin: 清華電機 ◆ From: thccy14.oz.nthu.edu.tw