Try   HackMD

資訊科技產業專案設計 作業3

contributed by <魏昇芷 - tissue>

NVIDIA - Embedded Software Engineer

What we need to see:

  • Experience in relevant domain.
  • Good English language skills to work effectively with global teams.
  • Full experience at Linux, QNX or Android.
  • Excellent C skills.
  • Experience working on embedded systems and ARM processor specific.

問題一

下面的程式碼是在做 str 的初始化,請問可能有什麼潛在的問題?

char c;
char str[128];
for (c = 0; c < 128; c++)
  str[c] = 0;

取自 https://www.pttweb.cc/bbs/Tech_Job/M.1612848862.A.6D2

試答

C 語言中的 char 是一個 8 bit 的有號數,其範圍為 127 ~ -128,因此這個迴圈會成為無迴圈,因為其數值永遠不會超過 128。

問題二

如果硬體不支援乘法,那 x = y * 200 要怎麼改才能得到正確答案

取自 https://www.pttweb.cc/bbs/Tech_Job/M.1612848862.A.6D2

試答

首先先將 200 轉成 2 進位,

20010 =
110010002
,由 2 進位可知 200 = 128 + 64 + 8。 接著我們可以反覆 y + y = 2y, 2y + 2y = 4y ,過程中我們可以得到 8y、64y、128y,將這三個數字相加 8y + 64y + 128y 即可得到 200y。 也可以用 shift 的。

問題三

實作一個 function,參數是 32-bit integer,回傳共有幾個 bits 是 1

取自 https://www.pttweb.cc/bbs/Tech_Job/M.1612848862.A.6D2

試答

用一個 for loop 逐一走訪 32 個 bit,並計算有幾個 bit 是 1

int countBit(int input) {
    int count = 0;
    for (int i = 0; i < 32; i++) {
        if (input & 1)
            count ++;
        input >>= 1;
    }
    return count;
}

問題四

承上題,有沒有什麼更快的做法

取自 https://www.pttweb.cc/bbs/Tech_Job/M.1612848862.A.6D2

試答

改成一次走訪 2 個 bit,並利用建表的方式快速得知該數字有幾個 bit 是 1

int countBit(int input) {
    int num[4] = {0, 1, 1, 2};
    int count = 0;
    for (int i = 0; i < 16; i++) {
        count += num[input & 3];
        input >>= 2;
    }
    return count;
}

另外,也可以繼續延伸成 1 次走訪 4、8、16、32 個 bit,一次走訪的 bit 數量越多,要建的表就越大,花費的記憶體資源就越多,因此必須在效能與記憶體空間之間做取捨。

更佳解法

int hammingWeight(uint32_t n) {
    n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1);
    n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2);
    n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4);
    n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8);
    n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16);
    return n; 
}

GOOGLE - Software Engineer, Embedded Systems, Silicon

Minimum qualifications:

  • Master's degree in Electrical Engineering, Computer Science, relevant technical field or equivalent practical experience.
  • Experience coding in C or C++.

Preferred qualifications:

  • Experience in ARM architecture and standard interfaces, bare-metal programming, bootloader, and firmware.
  • Experience in Linux kernel, device drivers, and Android system programming.
  • Experience in software/hardware integration.
  • Experience in optimizing algorithms with OpenGL/OpenCL/NEON/LLVM on CPU/TPU/GPU/DSP.
  • Verification experience using FPGAs and/or emulation platforms.
  • Familiarity with computer architecture, compilers, machine learning, or image processing.

相關面試經驗