참고 : 가장 효율적인 대답은 Serge's answer으로 생각하지만 재사용이 가장 쉽지는 않습니다. 따라서이 대답은 일차적 인 목적을 목표로하므로 모든 크기의 배열 (대상 배열이 충분히 큰 경우)로 다시 사용할 수 있습니다.
당신은 또한 당신이 더 일반적인 버전을 만들 수있는 것이다하는 std::bitset
을 통해 각 값을 전달할 수 있습니다.
int Data[8] = {0,0,190,42,0,0,2,33};
int bits[8 * (sizeof(int) * CHAR_BIT)] = {0};
convert_to_bits(Data, bits);
라이브 예를 here :
template<typename FromT, size_t FromSZ, typename ToT, size_t ToSZ>
void convert_to_bits(const FromT (&from_arr)[FromSZ], ToT (&to_arr)[ToSZ]) {
static_assert(ToSZ >= ((sizeof(FromT) * CHAR_BIT) * FromSZ),
"Destination array must have enough elements to contain all bits of source array.");
// Helper value, will be optimised out.
constexpr size_t ELEMENT_SIZE = sizeof(FromT) * CHAR_BIT;
// Handles bit manipulation cleanly.
std::bitset<ELEMENT_SIZE> temp[FromSZ];
// Populate temp.
for (size_t i = 0; i < FromSZ; i++) { temp[i] = from_arr[i]; }
// Fill destination array, one "row" (value in source array) at a time.
for (size_t i = 0; i < FromSZ; i++) {
size_t row = i * ELEMENT_SIZE;
using std::fill;
if (temp[i].none()) {
// Row is all 0s, fill its part of destination array appropriately.
fill(&to_arr[row], &to_arr[row + (ELEMENT_SIZE - 1)], 0);
} else if (temp[i].all()) {
// Row is all 1s, fill its part of destination array appropriately.
fill(&to_arr[row], &to_arr[row + (ELEMENT_SIZE - 1)], 1);
} else {
// Row is mixed, do it one bit at a time.
for (size_t j = 0; j < ELEMENT_SIZE; j++) {
to_arr[row + j] = temp[i][j];
}
}
}
}
이로 사용할 수 있습니다.
이것은 일반적으로 Serge Ballesta's answer보다 약간 느립니다.
는 [주 : 비교 모든 버전은 하드 코딩 내 코드에 해당하는 결과를 제공 할 수 있도록,되도록 ELEMENT_SIZE == 8
입니다 방탄복의이를 확인하기 위해, 나는 다섯 개 가지 버전 매크로의 각각 다섯 번, this program으로 테스트 컴파일 대답을하면, 직접 대답을 입력 할 수 있습니다. static_assert
은이를 수용하도록 convert_to_bits()
로부터 제거된다.]
은 각 경우에, 별도의 프로그램으로 컴파일 (희망) 캐시를 최소화하며 TutorialsPoint's online environment1 5 번 실행. 최적화 옵션이 지정되지 않았습니다.
한 번 -DSERGE
으로, Serge의 대답에 대해. convert_to_bits()
의 표준 사용 사례에 대한 -DTHROUGH
에 한 번
sh-4.3$ g++ -DSERGE main.cpp -std=c++14 -o serge
- .
convert_to_bits()
의 수동 인라인 버전 -DDIRECT
에 한 번 sh-4.3$ g++ -DTHROUGH main.cpp -std=c++14 -o through
.(하지만하지 않을 수 있습니다)해야하는지에 대한 -DFASTDIRECT
에 한 번
sh-4.3$ g++ -DDIRECT main.cpp -std=c++14 -o direct
,보다 효율적인 수동으로 인라인 버전. -DNAIVE
에 한 번
sh-4.3$ g++ -DFASTDIRECT main.cpp -std=c++14 -o fastdirect
, 적절한 std::fill()
를 사용하지 않는 순진 버전.
sh-4.3$ g++ -DNAIVE main.cpp -std=c++14 -o naive
평균적으로
은 ...
serge
은 29.4 틱했다.
through
은 30.8 틱이 걸렸다.
direct
은 30.6 틱이 걸렸습니다.
fastdirect
은 32.8 틱이 걸렸습니다.
naive
은 32.4 틱이 걸렸다.
1 : 때문에 자신의 C++ 링크는 지금 나를 위해 작동하지 않습니다, 나는 기술적으로는 온라인 Java 환경을 사용했다. 그러나 C++과 Java 환경 모두 동일한 도구를 사용하여 동일한 샌드 박스를 사용하기 때문에 이는 별다른 문제가 아닙니다. 내가 발견 한 유일한 차이점은 1) 기본 "Hello World"프로그램이 제공되고 (파일을 자유롭게 만들고 이름을 바꿀 수 있음) 2) "컴파일"및 "실행"버튼이 매핑 된 명령 메뉴에서 변경). 두 환경 모두 GCC와 Javac을 자유롭게 사용할 수 있으므로 Bash 셸에서 쉽게 실행할 수있다.
'j + i', 잠시 생각해 보거나 디버거에서 단계별로 실행 해보세요. –
@SamiKuhmonen 오른쪽으로 겹쳐 쓰기가 발생합니다. – Jcan1995
각 정수가 8 비트인지 확인하려면 'int'대신'std :: int8_t'를 사용하는 것이 좋습니다 (또는 코드를 지원하지 않는 플랫폼으로 포팅해야 할 수도있는 경우 8 비트 타입,'std :: int_least8_t'). 특별히 정수를 원하면'bits'는'sizeof (Data) * CHAR_BIT'이어야합니다. 그렇지 않으면 잠재적으로 데이터가 손실 될 수 있습니다. –