![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
img.png
11.9KB
1. 저는 LogN, Log2 함수가 있는지 몰랐습니다.(혹은, 잊어 버리고 있었거나)
math 유닛을 열어봐야 하는데 저의 귀차니즘이 몰고온 재난을 어찌 수습해야 할지... 파아~~ 2. 실제로 저는 이 질문을 쓰면서 <외부함수 사절> & <사칙연산으로 제한> 이라는 조건을 쓰려다 잊어 버렸습니다. 이 조건에 맞게 문제를 풀려고 몇시간 동안 끙끙거리고 있는것 같습니다. 사칙연산이 아니라도 적어도 복잡한 수학기호가 등장하지 않는 해법을 원했던 겁니다. 3. Log2() 함수를 열었더니 FYL2X라는 어셈블리 명령어를 사용하는데, 이 명령어는 Log2를 계산해주는 x87 명령어 이더군요. 사칙연산(또는 복잡한 수학기호를 제외한 연산) 만으로 이 문제를 풀 수 있었다면 x87에 FYL2X가 등장하지 않았으리라 추측해봅니다. 4. 자유게시판에 이 질문을 올린것은 델파이, 씨빌더 관련 질문이 아니고, 수학적 해법을 원하는 질문이었기 때문입니다. 게시판 관리자가 자유게시판에 어울리지 않는 질문과 답이라면 적절한 장소로 옮겨 주시리라 기대해 봅니다. 5. 도와 주셔서 감사합니다. log2를 쓰지 않고도...
입력값은 2의 승수로 제한된다, 그리고 말씀하신 X값이 0~32 또는 0~64 이내의 값이라는 정의만 있다면... 그냥 1로 설정된 비트가 처음으로 나타나는 위치를 찾으면 됩니다. .... 0000 0000 (0) -> 아무데도 나타나지 않으니 0 .... 0000 0001 (1) -> 첫번째 나타나니 1 .... 0000 0010 (2) -> 두번째 나타나니 2 .... 0000 0100 (4) -> 세번째 나타나니 3 .... 0000 1000 (8) -> 네번째 나타나니 4 델파이 코드로 만들어보면... function CheckBitStep(n: Integer): Integer; begin Result := 0; n := n shr 1; while n <> 0 do begin Inc(Result); n := n shr 1; end; end; procedure TMainForm.Button5Click(Sender: TObject); var i, n: Integer; begin n := 1; for i:= 1 to 10 do begin WriteLn(Format('%d -> %d', [n, CheckBitStep(n)])); n := n shl 1; end; end; 그런데... 요새 수치연산 프로세서 없는 기계는 찾아보기 힘드니... 저건 그냥 뻘짓. log2 가 더 빨라요~ 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
에이 뭐 박지훈님이 알아서 옮겨주시겠지...