문제
을 계산한의 번호를 설정 비트 단위에서 Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
최선의 방법은 무엇일까요?
해결책
나는 Specman을 알지 못하지만, 내가 본 또 다른 방법은 약간 치즈 맛이지만 효율적인 경향이 있습니다. 256 요소 배열을 유지하십시오. 배열의 각 요소는 해당 값에 해당하는 비트 수로 구성됩니다. 예를 들어 (pseudocode) :
bit_count = [0, 1, 1, 2, 1, ...]
따라서 bit_count2 == 1은 이진의 값 2에 단일 "1"비트를 가지기 때문에 == 1. 동시에 Bit_count [255] == 8.
그런 다음 uint를 바이트로 나누고 바이트 값을 사용하여 bit_count 배열에 인덱싱 한 다음 결과를 추가하십시오. 의사 코드 :
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
편집하다
이 문제는이 책에 나타납니다 아름다운 코드, Henry S. Warren의 장에서. 또한 Matt Howells는 비트 수를 효율적으로 계산하는 C- 언어 구현을 보여줍니다. 보다 이 답변.
다른 팁
방법 중 하나 내가 본다:
x_set_bits = pack(NULL, x).count(it == 1);
pack(NULL, x)
변환 x
목록의 비트입니다.
count
행위 목록에서 모든 요소에 대한 조건을 보유하고 있습니다.이 경우에는 조건이라는 요소에 같음을 1 제공하의 번호를 설정 비트입니다.
제휴하지 않습니다 StackOverflow