2015-01-13 3 views
0

임의의 자연수를 생성하는 루프에서 알고리즘을 찾고 있는데 n 증분과 2를 사용하여 곱하기를 사소한 방법으로 알 수 있습니다 (숫자 n 번 증가) 조금 더 빨리 뭔가를 찾고 있어요. 솔직히 나는 이것을 어떻게 시작해야할지조차 모른다.증가 및 2를 사용하여 임의의 숫자 생성

+0

으로도, 분할의 경우 (8 4 생성을 위해 다음 4 * 2 수 (8), 말), 당신은 두 번, 그 반 프리스트를 생성 할 수 있습니다. 홀수 인 경우 먼저 반을 생성하고 (나머지 1/2이 드롭 된 상태에서) 두 번 증가합니다 (13은 6을 생성하고 6 * 2 + 1은 13을 생성합니다). – CiaPan

+1

몇 가지 예를 제공해 주시겠습니까? 루프에서 작업하는 것은 초기 값, 증분 및 조건을 가정하며 루프 연산 중에는 숫자를 처리 할 것이므로 언제 종료해야합니까? – NoChance

+0

이진수를 알고 있습니까? :) – Jester

답변

3

기본적으로 원하는 것은 MSB부터 시작하여 오른쪽의 숫자 비트를 이동하는 것입니다.

예를 들어 번호가 70이면 이진수는 0b1000110입니다. 따라서 비트 1, 0, 0, 0, 1, 1, 0을 "이동"하려고합니다.

0으로 이동하려면 단순히 숫자를 두 배로하십시오. 하나를 이동하려면 숫자를 두 배로 늘린 다음 증분하십시오. 당신이 MSB에서 비트의 배열을 제공하는 경우 (왼쪽에서 오른쪽으로, 즉)

if (bit_to_be_shifted_in != 0) 
    x = (x * 2) + 1; 
else 
    x = x * 2; 

그래서, LSB, 다음 C 코드는 다음과 같습니다 :이 일을

x = 0; 
for (i = 0; i < number_of_bits; i++) 
{ 
    if (bits[i] != 0) 
     x = x * 2 + 1; 
    else 
     x = x * 2; 
} 
0

한 가지 방법을 거꾸로 간다. 홀수 인 경우 1을 뺍니다. 원하는 번호가 짝수 경우 2.

while(n > 0) { 
    n & 1 ? n &= ~1 : n >>= 1; 
} 
관련 문제