我想請問一下位元遮罩&的原理!為什麼以下會出現非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