Re: [討論] 給排序過的Array 用最少運算資源找值

作者: OnlyRD (里巷人)   2022-06-08 11:50:43
#include <iostream>
#include <tuple>
#include <utility>
template<int E, int H, int... Rest>
struct find_helper {
static constexpr auto rest() -> std::size_t {
if constexpr(H==E)
return std::tuple_size_v<decltype(std::make_tuple(Rest...))>;
else
return find_helper<E, Rest...>::rest();
}
};
template<int E, int H>
struct find_helper<E, H> {
static constexpr auto rest() -> std::size_t {
if constexpr(H==E)
return 0;
else
return -1;
}
};
template<int E, int... Values>
auto find_first() -> std::size_t {
return sizeof...(Values) - find_helper<E, Values...>::rest() - 1;
}
int main() {
std::cout << find_first<0, 1, 1, 1, 0, 0>();
return 0;
}
如果找得到,回傳index,範圍0~N-1,N為Array 長度。
如果找不到,回傳N。
如果Array為空,編譯錯誤。
前提是Array要編譯期就知道內容。
不過如果你是面試IC廠,我想應該是動態Array。
如果裡面的值都是0跟1
我猜應該是儲存的時候就用shift存成Bits
然後使用找第一個0的bit的指令去找
這是IC廠會幹的事
記憶體量最少、計算最快。
作者: hsnuyi (羊咩咩~)   2022-06-09 02:29:00
如果是IC廠 就是在C裡面內嵌assembly 不是用C++
作者: CoNsTaR ((const *))   2022-06-09 06:07:00
看樓上推文就想到這篇 #1LFwOPgj (C_and_CPP)雖然沒用到 asm
作者: hsnuyi (羊咩咩~)   2022-06-10 00:09:00
如果array大到在DRAM內 其實有很多可討論的... 連CPU外的bus上能傳怎樣的指令都可拿出來檢驗...
作者: CoNsTaR ((const *))   2022-06-10 01:50:00
編譯時期先算好這個 asm 要怎麼贏?XD主要的問題應該還是面試想要考你什麼吧
作者: hsnuyi (羊咩咩~)   2022-06-10 03:51:00
IC設計會考的就不會是template 驗證設計也是用asm打AXI傳輸上bus 有時還要注意MMU和cache 要用C++解就沒啥好評論的了

Links booklink

Contact Us: admin [ a t ] ucptt.com