1 前言
最近博主在后臺(tái)收到一位朋友的咨詢,說他最近參加了一場技術(shù)面試,有這么一道筆試題:
請(qǐng)使用C語言的宏定義實(shí)現(xiàn)一個(gè)功能,求得某個(gè)整型數(shù)M在N字節(jié)對(duì)齊的時(shí),它的值大小。
說明:
1.M是一個(gè)非負(fù)整數(shù);
2.N是2的整數(shù)倍,值可能是1,2,4,8,16等等。
要求:
1.不得使用除法(/);
2.不能使用函數(shù)實(shí)現(xiàn),只能用宏實(shí)現(xiàn);
3.自行設(shè)計(jì)測(cè)試用例,明確得出測(cè)試用例執(zhí)行成功與否。
2 代碼實(shí)現(xiàn)
剛好,今天比較清閑,茶余飯后,順手?jǐn)]了一把代碼:
#include
#include
/* max test number for aligned */
#define MAX_TEST_NUM 1000
/* default for 8 bytes */
#define DEF_ALIGNED_BYTES 8
/* n = 2/4/6/8/16/... */
#define GET_ALIGNED_2_POWER_NUM(num, n) (((num) + (n) - 1) & (~((n) - 1)))
int main(int argc, const char *argv[])
{
int i = 0;
int max_cnt = MAX_TEST_NUM;
int aligned_bytes = DEF_ALIGNED_BYTES;
int aligned_num;
if (argc > 1) {
aligned_bytes = atoi(argv[1]);
if (aligned_bytes < 0) {
printf("error aligned_bytes input !\r\n");
return -1;
}
}
/* test cases start */
for (i = 0; i < max_cnt; i++) {
aligned_num = GET_ALIGNED_2_POWER_NUM(i, aligned_bytes);
//printf("%-4d ALIGNED %d => %-4d\r\n", i, aligned_bytes, aligned_num);
if (aligned_num % aligned_bytes != 0) {
printf("error aligned_num get: %-4d ALIGNED %d => %-4d\r\n", i, aligned_bytes, aligned_num);
printf("test cases (0 ~ %d) ALIGNED %d [ FAIL ] !\r\n", max_cnt, aligned_bytes);
return -1;
}
}
printf("test cases (0 ~ %d) ALIGNED %d [ OK ] !\r\n", max_cnt, aligned_bytes);
return 0;
}
3 代碼驗(yàn)證
ubuntu下面使用gcc編譯,得到可執(zhí)行文件:
gcc -o test main.c
跑了下測(cè)試用例:
recan@ubuntu:~/llc/aligned_macro_test$ ./test 2
test cases (0 ~ 1000) ALIGNED 2 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 4
test cases (0 ~ 1000) ALIGNED 4 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 8
test cases (0 ~ 1000) ALIGNED 8 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 16
test cases (0 ~ 1000) ALIGNED 16 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 32
test cases (0 ~ 1000) ALIGNED 32 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 64
test cases (0 ~ 1000) ALIGNED 64 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 128
test cases (0 ~ 1000) ALIGNED 128 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 256
test cases (0 ~ 1000) ALIGNED 256 [ OK ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 3
error aligned_num get: 1 ALIGNED 3 => 1
test cases (0 ~ 1000) ALIGNED 3 [ FAIL ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 5
error aligned_num get: 1 ALIGNED 5 => 1
test cases (0 ~ 1000) ALIGNED 5 [ FAIL ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 7
error aligned_num get: 1 ALIGNED 7 => 1
test cases (0 ~ 1000) ALIGNED 7 [ FAIL ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 167
error aligned_num get: 1 ALIGNED 167 => 1
test cases (0 ~ 1000) ALIGNED 167 [ FAIL ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$ ./test 79
error aligned_num get: 1 ALIGNED 79 => 1
test cases (0 ~ 1000) ALIGNED 79 [ FAIL ] !
recan@ubuntu:~/llc/aligned_macro_test$
recan@ubuntu:~/llc/aligned_macro_test$
從log上看,基本實(shí)現(xiàn)了功能,對(duì)于非對(duì)齊的數(shù)值,都能做出準(zhǔn)確的判斷。
大家記住這個(gè)宏定義吧!
/* n = 2/4/6/8/16/... */
#define GET_ALIGNED_2_POWER_NUM(num, n) (((num) + (n) - 1) & (~((n) - 1)))
4 題外話
題外話,如果把題目中的N改為【任意非負(fù)整數(shù)】呢?
又該如何改造這個(gè)宏定義呢?
下次有時(shí)間,我們?cè)僭囋嚳矗?/p>
5 更多分享
歡迎關(guān)注我的github倉庫01workstation,日常分享一些開發(fā)筆記和項(xiàng)目實(shí)戰(zhàn),歡迎指正問題。
同時(shí)也非常歡迎關(guān)注我的專欄:有問題的話,可以跟我討論,知無不答,謝謝大家。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
C語言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146122 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9449
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
【經(jīng)典面試題】請(qǐng)使用C語言編程實(shí)現(xiàn)對(duì)IPV4地址的合法性判斷
【經(jīng)典面試題】請(qǐng)使用C語言編程實(shí)現(xiàn)對(duì)IPV4地址的合法性判斷
12個(gè)常見的C語言面試題
12個(gè)C語言面試題,涉及指針、進(jìn)程、運(yùn)算、結(jié)構(gòu)體、函數(shù)、內(nèi)存
發(fā)表于 12-31 06:36
c語言面試題,c++面試題下載
c語言面試題,c++面試題1. static有什么用途?(請(qǐng)至少說明兩種) 1) 限制變量的作用域 2) 設(shè)置變量的存儲(chǔ)域 2.&
發(fā)表于 10-22 11:19
?5次下載
單片機(jī)C語言面試題的詳細(xì)資料合集
本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C語言面試題的詳細(xì)資料合集。
發(fā)表于 07-24 17:37
?24次下載
解析C語言結(jié)構(gòu)體字節(jié)如何對(duì)齊
01 默認(rèn)字節(jié)對(duì)齊 C語言結(jié)構(gòu)體字節(jié)對(duì)齊是老生常談的問題了,也是高頻
分享10道有趣的嵌入式C語言面試題及答案
10個(gè)C語言面試題,涉及指針、進(jìn)程、運(yùn)算、結(jié)構(gòu)體、函數(shù)、內(nèi)存,看看你能做出幾個(gè)!
【C語言進(jìn)階】面試題:請(qǐng)使用宏定義實(shí)現(xiàn)字節(jié)對(duì)齊
評(píng)論