从整数中获取每个数字

假设我有一个名为’score’的整数,如下所示:

int score = 1529587; 

现在我想做的是使用按位运算符从得分中获取每个数字1,5,2,9,5,8,7 (参见下面的编辑说明)。

我很确定这可以做到,因为我曾经使用类似的方法从hex颜色值中提取红绿色和蓝色值。

我该怎么办?

编辑
它不一定是按位运算符,我只是认为它更简单。

您使用模运算符:

 while(score) { printf("%d\n", score % 10); score /= 10; } 

请注意,这将以相反的顺序给出数字(即最低有效数字)。 如果你想要最重要的数字,你必须将数字存储在一个数组中,然后以相反的顺序读出它们。

RGB值很好地落在位边界上; 十进制数字不。 我认为根本不使用按位运算符来实现这一点。 你需要使用十进制运算符,如模10(%10)。

同意以前的答案。

一点点修正:有一种更好的方法可以从左到右打印十进制数字,而无需分配额外的缓冲区。 此外,如果score为0,您可能希望显示零追踪者(之前答案中建议的循环不会打印任何内容)。

这需要额外的通行证:

 int div; for (div = 1; div <= score; div *= 10) ; do { div /= 10; printf("%d\n", score / div); score %= div; } while (score); 

不要重新发明轮子。 C有sprintf是有原因的。 由于您的变量被称为得分,我猜这是一个游戏,您计划使用得分的个别数字将数字字形显示为图像。 在这种情况下,sprintf具有方便的格式修饰符,可以让您将分数填充到空白区域等固定宽度,这可能是您想要使用的。

该解决方案在整个范围[0,UINT_MAX]上提供正确的结果,而不需要缓冲数字。

它也适用于更宽的类型或带有正值的带符号类型,并且具有适当的类型更改。

这种方法在微小环境(例如Arduino引导程序)上特别有用,因为它不会导致所有printf()膨胀(当printf()不用于演示输出时)并且使用非常少的RAM。 你可以通过闪烁单个领导来看看价值:)

 #include  #include  int main (void) { unsigned int score = 42; // Works for score in [0, UINT_MAX] printf ("score via printf: %u\n", score); // For validation printf ("score digit by digit: "); unsigned int div = 1; unsigned int digit_count = 1; while ( div <= score / 10 ) { digit_count++; div *= 10; } while ( digit_count > 0 ) { printf ("%d", score / div); score %= div; div /= 10; digit_count--; } printf ("\n"); return 0; } 

通常,此问题通过在循环中使用数字的模数或将数字转换为字符串来解决。 要将数字转换为字符串,您可以使用itoa函数,因此在循环中考虑带有数字模数的变量。


文件内容get_digits.c

 $ cat get_digits.c #include  #include  #include  // return a length of integer unsigned long int get_number_count_digits(long int number); // get digits from an integer number into an array int number_get_digits(long int number, int **digits, unsigned int *len); // for demo features void demo_number_get_digits(long int number); int main() { demo_number_get_digits(-9999999999999); demo_number_get_digits(-10000000000); demo_number_get_digits(-1000); demo_number_get_digits(-9); demo_number_get_digits(0); demo_number_get_digits(9); demo_number_get_digits(1000); demo_number_get_digits(10000000000); demo_number_get_digits(9999999999999); return EXIT_SUCCESS; } unsigned long int get_number_count_digits(long int number) { if (number < 0) number = llabs(number); else if (number == 0) return 1; if (number < 999999999999997) return floor(log10(number)) + 1; unsigned long int count = 0; while (number > 0) { ++count; number /= 10; } return count; } int number_get_digits(long int number, int **digits, unsigned int *len) { number = labs(number); // termination count digits and size of a array as well as *len = get_number_count_digits(number); *digits = realloc(*digits, *len * sizeof(int)); // fill up the array unsigned int index = 0; while (number > 0) { (*digits)[index] = (int)(number % 10); number /= 10; ++index; } // reverse the array unsigned long int i = 0, half_len = (*len / 2); int swap; while (i < half_len) { swap = (*digits)[i]; (*digits)[i] = (*digits)[*len - i - 1]; (*digits)[*len - i - 1] = swap; ++i; } return 0; } void demo_number_get_digits(long int number) { int *digits; unsigned int len; digits = malloc(sizeof(int)); number_get_digits(number, &digits, &len); printf("%ld --> [", number); for (unsigned int i = 0; i < len; ++i) { if (i == len - 1) printf("%d", digits[i]); else printf("%d, ", digits[i]); } printf("]\n"); free(digits); } 

使用GNU GCC进行演示

 $~/Downloads/temp$ cc -Wall -Wextra -std=c11 -o run get_digits.c -lm $~/Downloads/temp$ ./run -9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] -10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -1000 --> [1, 0, 0, 0] -9 --> [9] 0 --> [0] 9 --> [9] 1000 --> [1, 0, 0, 0] 10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] 

使用LLVM / Clang进行演示

 $~/Downloads/temp$ rm run $~/Downloads/temp$ clang -std=c11 -Wall -Wextra get_digits.c -o run -lm setivolkylany$~/Downloads/temp$ ./run -9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] -10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -1000 --> [1, 0, 0, 0] -9 --> [9] 0 --> [0] 9 --> [9] 1000 --> [1, 0, 0, 0] 10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] 

测试环境

 $~/Downloads/temp$ cc --version | head -n 1 cc (Debian 4.9.2-10) 4.9.2 $~/Downloads/temp$ clang --version Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0) Target: x86_64-pc-linux-gnu Thread model: posix 
 //this can be easily understandable for beginners int score=12344534; int div; for (div = 1; div <= score; div *= 10) { } /*for (div = 1; div <= score; div *= 10); for loop with semicolon or empty body is same*/ while(score>0) { div /= 10; printf("%d\n`enter code here`", score / div); score %= div; } 
 #include int main() { int num; //given integer int reminder; int rev=0; //To reverse the given integer int count=1; printf("Enter the integer:"); scanf("%i",&num); /*First while loop will reverse the number*/ while(num!=0) { reminder=num%10; rev=rev*10+reminder; num/=10; } /*Second while loop will give the number from left to right*/ while(rev!=0) { reminder=rev%10; printf("The %d digit is %d\n",count, reminder); rev/=10; count++; //to give the number from left to right } return (EXIT_SUCCESS);}