[問題] C考古題

看板C_and_CPP作者 (fakewen)時間11年前 (2014/03/21 13:34), 編輯推噓5(5016)
留言21則, 4人參與, 最新討論串1/1
32-bit machine用C語言對位址 0x00005000 的第三個bit設成0, 第五個bit設成1。 請問他的"第3個"是從高位元算(00100000)還是(00000100) 這有牽涉到big Endian嗎? 等等等,我confused了。 我原本以為 1.我只要把0x00005000當一個數字,不用管題目裡的"位址"的意思 2.0x00005000是32bits,所以"第5個bit設成1"應該是 0x08000000 所以我的code長這樣 unsigned int addr=0X00005000; addr&=0XDFFFFFFF; //1101 addr|=0X08000000; //0000 1000 printf("0X%08X",addr); 所以我重申一下我的問題 除了原來的問題 1.第3bit到底從高位還是低位算 2.題目中"位址"的意義? 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.248.75.167

03/21 13:36, , 1F
我覺得這牽涉到中文 他的描述不明確
03/21 13:36, 1F
※ 編輯: fakewen 來自: 111.248.75.167 (03/21 14:22)

03/21 15:09, , 2F
英文基本上會說3rd highest/lowest bit 所以敘述不清
03/21 15:09, 2F

03/21 15:17, , 3F
那"位址"呢?
03/21 15:17, 3F

03/21 15:30, , 4F
位址指向的那個byte。 (*addr).bit[3] = 0;
03/21 15:30, 4F
這樣不會怪怪的嗎? (*addr).bit[3] = 0; (*addr).bit[5] = 1;拿分?= = ※ 編輯: fakewen 來自: 111.248.75.167 (03/21 16:39)

03/21 17:02, , 5F
文第二行把二進位和十六進位搞混了,另這與little/big無關
03/21 17:02, 5F
已修改THX

03/21 17:08, , 6F
猜測從lowest-bit算可能性大一點,因二進位右算到左
03/21 17:08, 6F

03/21 17:12, , 7F
azureblaze應只是舉概念,合邏輯,因位址像固定刻度沒有在改的
03/21 17:12, 7F

03/21 17:25, , 8F
應說從least significant bit開始算,好久沒用這個詞
03/21 17:25, 8F

03/21 17:26, , 9F
語意的確不清,沒說是否有第零個bit
03/21 17:26, 9F
※ 編輯: fakewen 來自: 111.248.75.167 (03/21 17:44)

03/21 22:09, , 10F
我看到題目的 位址 會以為它要做的是 *(uint*)0x00005000
03/21 22:09, 10F
這行我執行不會過ㄟ 就算換成 unsigned int a=0x00005000; int val =*a; 也不會過compile

03/21 22:11, , 11F
再做 var&=(1U<<3) , var|=~(1U<<5), 這動作用中文解釋就
03/21 22:11, 11F

03/21 22:11, , 12F
如題意所述 ( 雖不明確,但還蠻接近的..)
03/21 22:11, 12F

03/21 22:12, , 13F
(補誤,是 var&=~(1U<<3) , var|=(1U<<5) )
03/21 22:12, 13F
※ 編輯: fakewen 來自: 111.248.75.167 (03/21 23:03)

03/21 23:14, , 14F
假想位址丟到真的compiler裡當然不會過
03/21 23:14, 14F

03/21 23:23, , 15F
unsigned int val = *(unsigned int*)0x00005000;
03/21 23:23, 15F

03/21 23:24, , 16F
這動作通常是非法,但在極少情況下又會想要這麼搞...
03/21 23:24, 16F

03/21 23:46, , 17F
附上 demo code 好了.. http://codepad.org/zYYNfwpz
03/21 23:46, 17F
感謝大大,我大概懂了,你先宣告了一個uint再用他的位址,降不會有error 但如果我直接*(0x00005000)就有可能會錯誤存取! 還有幫你抓一下,你bit位置算錯了,1U已經在第1bit上了 還有~似乎也放錯位置了,應該要降 *pAddr&=~(1U<<2) , *pAddr|=(1U<<4); ※ 編輯: fakewen 來自: 111.248.75.167 (03/22 04:01)

03/22 07:10, , 18F
他沒定義有沒有第零bit...
03/22 07:10, 18F

03/22 09:57, , 19F
我個人是覺得 1U<<0 是第0bit設1 ; 1U<<3 是第3bit設1
03/22 09:57, 19F

03/22 09:57, , 20F
畢竟這在 bitwise-array 也比較直覺,不過定義的問題沒說清
03/22 09:57, 20F

03/22 09:57, , 21F
的話再多的 "我覺得" 也都不太有意義。
03/22 09:57, 21F
文章代碼(AID): #1JAyzi_d (C_and_CPP)