Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

819.25ใ‚’ๆŽ›ใ‘ใฆ8192ใงๅ‰ฒใ‚Œใฐใ€10ใงๅ‰ฒใฃใŸใฎใซ่ฟ‘ใ„ๅ€คใŒๅพ—ใ‚‰ใ‚Œใ‚‹่ชฌใ‚’ๆคœ่จผ๏ผ

Posted at

่ƒŒๆ™ฏ

ไธ€่ˆฌใซใ€้™ค็ฎ—ๅ‘ฝไปคใฎ็„กใ„CPUใงๆ•ดๆ•ฐใฎ้™ค็ฎ—ใ‚’่กŒใ†ใฎใฏใ€้‡ใ„ๅ‡ฆ็†ใซใชใ‚ŠใŒใกใงใ‚ใ‚‹ใ€‚
ใ—ใ‹ใ—ใ€ใ€Œ10ใงๅ‰ฒใ‚‹ใ€ใจใ„ใ†ใฎใฏใ€ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟๅ‘ใ‘ใฎไบŒ้€ฒๆ•ฐใ‹ใ‚‰ไบบ้–“ๅ‘ใ‘ใฎๅ้€ฒๆ•ฐใซๅค‰ๆ›ใ™ใ‚‹ใจใใชใฉใ€ใ‚ˆใ่กŒใ‚ใ‚Œใ‚‹ๅ‡ฆ็†ใงใ‚ใ‚‹ใ€‚
2ใฎๆญฃใฎๆ•ดๆ•ฐไน—ใงใฎๅ‰ฒใ‚Š็ฎ—ใฏใ€ใƒ“ใƒƒใƒˆใ‚ทใƒ•ใƒˆใง่กจ็พใงใใ‚‹ใฎใงใ€้™ค็ฎ—ๅ‘ฝไปคใŒ็„กใใฆใ‚‚ๆฏ”่ผƒ็š„็ฐกๅ˜ใซใงใใ‚‹ใ“ใจใŒๅคšใ„ใ€‚
ใใ“ใงใ€10ใงๅ‰ฒใฃใŸๅ€คใ‚’ใ€ๆ„š็›ดใซ้™ค็ฎ—ใ‚’่กŒใ†ใ‚ˆใ‚Šใ‚‚็ฐกๅ˜ใชๅ‡ฆ็†ใงๆฑ‚ใ‚ใŸใ„ใ€‚

ๆœ€ๅˆใฎใ‚ขใ‚คใƒ‡ใ‚ข

2ใฎๆญฃใฎๆ•ดๆ•ฐไน—ใ‚’ๅ้€ฒๆ•ฐใง่กจใ—ใŸใจใใ€ใใฎ1ใฎไฝใฏๅฟ…ใš2ใƒป4ใƒป6ใƒป8ใฎใ„ใšใ‚Œใ‹ใงใ‚ใ‚‹ใ€‚
ๅถๆ•ฐใ—ใ‹็„กใ„ใ†ใˆใ€0 ใ‚‚็„กใ„ใŸใ‚ 10 ใฎๅ€ๆ•ฐใซใฏใชใ‚‰ใชใ„ใ€‚
ใ—ใ‹ใ—ใ€1ใฎไฝใŒใ€Œ2ใ€ใฎใจใใฏใ€10ใงๅ‰ฒใ‚‹ใจใ€Œ0.2ใ€ใซใชใ‚‹ใ€‚
ใ€Œ0.2ใ€ใ‚’่กจ็พใ™ใ‚‹ใฎใฏ้›ฃใ—ใ„ใŒใ€ใ€Œ0.25ใ€ใ‚’ๆŽ›ใ‘ใ‚‹ใฎใงใ‚ใ‚Œใฐ2ใƒ“ใƒƒใƒˆๅณใ‚ทใƒ•ใƒˆใ™ใ‚‹ใ“ใจใง่กจ็พใงใใ‚‹ใ€‚
ใ‚ใ‚‹็จ‹ๅบฆๅคงใใ„ๆ•ฐใ‚’ไฝฟใฃใŸใปใ†ใŒใ€่ชคๅทฎใฏๅฐ‘ใชใใชใ‚‹ใ ใ‚ใ†ใ€‚

ใจใ„ใ†่€ƒๅฏŸใ‚’่ธใพใˆใ€819.25 / 8192 ใ‚’่จˆ็ฎ—ใ—ใฆใฟใ‚‹ใจใ€0.100006103515625 ใจใชใฃใŸใ€‚
0.1 ใฎใ‚ใจใซใ‚ใ‚‹็จ‹ๅบฆ 0 ใŒไธฆใ‚“ใงใ„ใ‚‹ใฎใงใ€ใ“ใ‚Œใง10ใงๅ‰ฒใ‚‹ใฎใซ่ฟ‘ใ„ๅ€คใŒๅพ—ใ‚‰ใ‚Œใ‚‹ใ‹ใชโ€ฆโ€ฆ๏ผŸ

ๆœ€ๅˆใฎใ‚ขใ‚คใƒ‡ใ‚ขใ‚’ๆคœ่จผ

ๅฎŸ้š›ใซใ€Œ819.25ใ‚’ๆŽ›ใ‘ใฆ8192ใงๅ‰ฒใ‚‹ใ€ใ‚’่กŒใฃใŸๅ€คใจใ€10ใงๅ‰ฒใฃใŸๅ€คใ‚’ๆฏ”่ผƒใ—ใฆใฟใ‚‹ใ€‚
ๅคงใใ„ๅ€คใ‚’ๅ…ฅๅŠ›ใ—ใŸใจใใซใฏ่ชคๅทฎใŒๅ‡บใฆใ‚‚ใ€ๅฐใ•ใ„ๅ€คใฎๅ…ฅๅŠ›ใชใ‚‰ๆญฃใ—ใ„ๅ€คใŒๅ‡บใฆใใ‚‹ใฎใงใ‚ใ‚Œใฐใ€ๅๅˆ†ไฝฟใˆใ‚‹ใ“ใจใŒๆœŸๅพ…ใงใใ‚‹ใ€‚
ใฉใฎใใ‚‰ใ„ใฎๅ€คใพใง่€ใˆใ‚‰ใ‚Œใ‚‹ใ‹ใ€ใ‚„ใฃใฆใฟใ‚ˆใ†ใ€‚

#include <stdio.h>
#include <limits.h>

unsigned int div10(unsigned int a) {
	return (a * 819ull + (a >> 2)) >> 13;
}

int main(void) {
	for (unsigned int i = 0; ; i++) {
		if (div10(i) != i / 10) {
			printf("%u -> %u\n", i, div10(i));
			break;
		}
		if (i == UINT_MAX) break;
	}
	return 0;
}

ใ“ใ‚Œใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจใ€

16389 -> 1639

ใจๅ‡บๅŠ›ใ•ใ‚ŒใŸใ€‚
ใ™ใชใ‚ใกใ€0๏ฝž16388 ใ‚’ๅ…ฅๅŠ›ใ—ใŸใจใใฏๆญฃใ—ใ„ 10 ใงๅ‰ฒใฃใŸๅ•†ใŒๅพ—ใ‚‰ใ‚ŒใŸใŒใ€16389 ใ‚’ๅ…ฅๅŠ›ใ™ใ‚‹ใจๆญฃใ—ใ„ๅ•† 1638 ใ‚ˆใ‚Š 1 ๅคงใใ„ๅ€คใŒๅ‡บใฆใ—ใพใฃใŸใ€‚

ใ›ใ‚ใฆ16ใƒ“ใƒƒใƒˆ (65535) ใพใงใฏ่€ใˆใฆใปใ—ใ‹ใฃใŸใชโ€ฆโ€ฆ

ๅคงใใ™ใŽใ‚‹ๅ€คใŒๅ‡บใ‚‹ใชใ‚‰ๆธ›ใ‚‰ใ—ใฆใฟใ‚ˆใ†

ใ‚‚ใจใ‚‚ใจใ€819.25 / 8192 ใฎๅ€คใฏ 0.100006103515625 ใงใ‚ใ‚Šใ€0.1 ใ‚ˆใ‚Šๅฐ‘ใ—ๅคงใใ„ใ€‚
ๅ…ฅๅŠ›ใ‚’ๅคงใใใ™ใ‚‹ใจๅ‡บๅŠ›ใ‚‚ๆฌฒใ—ใ„ๅ€คใ‚ˆใ‚Šๅคงใใใชใ‚‹ใฎใฏใ€ใ“ใฎใŸใ‚ใ ใ‚ใ†ใ€‚

ๅ‡บๅŠ›ใŒๅฐ‘ใ—ๅคงใใใชใ‚‹ใฎใงใ‚ใ‚Œใฐใ€ๅฐ‘ใ—ๅผ•ใ„ใฆ่ฃœๆญฃใ—ใฆใฟใŸใ‚‰ใฉใ†ใ ใ‚ใ†ใ‹๏ผŸ
ใ‚„ใฃใฆใฟใ‚ˆใ†ใ€‚

ใ“ใฎ็ซ ใงใฏใ€ๅ‰็ซ ใฎใ‚ณใƒผใƒ‰ใ‹ใ‚‰ div10 ้–ขๆ•ฐใฎใฟใ‚’ๅค‰ใˆใŸใ‚ณใƒผใƒ‰ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใฎใงใ€div10 ้–ขๆ•ฐใจๅ‡บๅŠ›็ตๆžœใฎใฟใ‚’็คบใ™ใ€‚

unsigned int div10(unsigned int a) {
	return (a * 819ull + (a >> 2) - (a >> 3)) >> 13;
}
10 -> 0

ๅผ•ใใ™ใŽใŸใ‚ˆใ†ใ ใ€‚

unsigned int div10(unsigned int a) {
	return (a * 819ull + (a >> 2) - (a >> 4)) >> 13;
}
50 -> 4

ใพใ ๅผ•ใใ™ใŽใฎใ‚ˆใ†ใ ใ€‚

unsigned int div10(unsigned int a) {
	return (a * 819ull + (a >> 2) - (a >> 5)) >> 13;
}
43669 -> 4367

ใŠใฃใ€ๆญฃใ—ใ„ๅ€คใŒๅพ—ใ‚‰ใ‚Œใ‚‹็ฏ„ๅ›ฒใŒไผธใณใŸใž๏ผ

unsigned int div10(unsigned int a) {
	return (a * 819ull + (a >> 2) - (a >> 5) - (a >> 6)) >> 13;
}
261629 -> 26163

ๆญฃใ—ใ„ๅ€คใŒๅพ—ใ‚‰ใ‚Œใ‚‹็ฏ„ๅ›ฒใŒใ•ใ‚‰ใซไผธใณใ€็›ฎๆจ™ใฎ16ใƒ“ใƒƒใƒˆใ‚’็ช็ ดใ—ใŸใž๏ผ

unsigned int div10(unsigned int a) {
	return (a * 819ull + (a >> 2) - (a >> 5) - (a >> 6) - (a >> 9) - (a >> 10)) >> 13;
}
4175869 -> 417587

ใ•ใ‚‰ใซ่ฉฆใ™ใจใ€ใฉใ†ใ‚„ใ‚‰ใ‚ทใƒ•ใƒˆๅน…ใ‚’2้€ฃ็ถšใงไฝฟใ„ใ€ใใฎๅพŒ2ใ‚ใ‘ใฆใพใŸ2้€ฃ็ถšใงไฝฟใ„โ€ฆโ€ฆใจใ™ใ‚‹ใจใ€ใฉใ‚“ใฉใ‚“ๆญฃใ—ใ„ๅ€คใŒๅพ—ใ‚‰ใ‚Œใ‚‹็ฏ„ๅ›ฒใŒไผธใณใ‚‹ใฟใŸใ„ใ ๏ผ

unsigned int div10(unsigned int a) {
	return (
		a * 819ull + (a >> 2) - (a >> 5) - (a >> 6) - (a >> 9) - (a >> 10)
		- (a >> 13) - (a >> 14)
	) >> 13;
}
66650109 -> 6665011

ใ„ใ„ใžใ„ใ„ใž๏ผ

unsigned int div10(unsigned int a) {
	return (
		a * 819ull + (a >> 2) - (a >> 5) - (a >> 6) - (a >> 9) - (a >> 10)
		- (a >> 13) - (a >> 14) - (a >> 17) - (a >> 18)
	) >> 13;
}
1063780349 -> 106378035

ใ‚‚ใ†ๅฐ‘ใ—๏ผ

unsigned int div10(unsigned int a) {
	return (
		a * 819ull + (a >> 2) - (a >> 5) - (a >> 6) - (a >> 9) - (a >> 10)
		- (a >> 13) - (a >> 14) - (a >> 17) - (a >> 18) - (a >> 21) - (a >> 22)
	) >> 13;
}

ใคใ„ใซใ€32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใฎๅ…จ็ฏ„ๅ›ฒใงๆญฃใ—ใ„ๅ€คใŒๅพ—ใ‚‰ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใฃใŸ๏ผ

่€ƒๅฏŸใจๆ•ด็†

ใ“ใฎใ€Œ2้€ฃ็ถšใงไฝฟใ„ใ€ใใฎๅพŒ2ใ‚ใ‘ใฆใพใŸ2้€ฃ็ถšใงไฝฟใ„ใ€ใจใ„ใ†็‰นๅพด็š„ใชใƒ‘ใ‚ฟใƒผใƒณใฏใ€ไฝ•ใ‚’่กจใ—ใฆใ„ใ‚‹ใฎใ ใ‚ใ†ใ‹๏ผŸ

Interactive visualization of the floating-point format

ใง 0.1 ใ‚’ๅค‰ๆ›ใ—ใฆใฟใ‚‹ใจใ€ไปฅไธ‹ใฎ็ตๆžœใŒๅพ—ใ‚‰ใ‚ŒใŸใ€‚

่ฆ็ด  ๅ€ค
Sign 0
Exponent 0 1 1 1 1 0 1 1
mantissa 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1

Sign ใ‚„ Exponent ใฏๅคงๆ–‡ๅญ—ใ‹ใ‚‰ๅง‹ใพใ‚‹ใŒใ€mantissa ใฏๅฐๆ–‡ๅญ—ใ‹ใ‚‰ๅง‹ใพใ‚‹ใ€‚
ใ“ใ‚ŒใฏๅŽŸๆ–‡ใƒžใƒžใงใ‚ใ‚‹ใ€‚

ใ“ใ‚Œใฏใ€ๅ้€ฒๆ•ฐใฎ 0.1 ใฏใ€ไบŒ้€ฒๆ•ฐใงใฏ 1.10011001100110011001101โ€ฆ ร— 2โˆ’4 ใจ่กจใ›ใ‚‹ใ“ใจใ‚’็คบใ—ใฆใ„ใ‚‹ใ€‚
ใ“ใฎใ€Œ11001100โ€ฆใ€ใจใ„ใ†ใƒ‘ใ‚ฟใƒผใƒณใŒใ€ใ€Œ2้€ฃ็ถšใงไฝฟใ„ใ€ใใฎๅพŒ2ใ‚ใ‘ใฆใพใŸ2้€ฃ็ถšใงไฝฟใ„ใ€ใฎๆญฃไฝ“ใงใ‚ใ‚‹ใจ่€ƒใˆใ‚‰ใ‚Œใ‚‹ใ€‚
ใ•ใ‚‰ใซใ€ๅ้€ฒๆ•ฐใฎ 819 ใ‚‚ใ€ไบŒ้€ฒๆ•ฐใง่กจใ™ใจ 1100110011 ใจใชใ‚Šใ€ใƒ‘ใ‚ฟใƒผใƒณใซๆฒฟใฃใฆใ„ใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚‹ใ€‚

ใจใ„ใ†ใ“ใจใฏใ€ไปŠๅ›žใ‚„ใฃใŸใฎใฏไบŒ้€ฒๆ•ฐใฎ 1100110011.01 - 0.00001100110011โ€ฆ ใ‚’ๆŽ›ใ‘ใฆ 213 ใงๅ‰ฒใ‚‹ใ€ใจใ„ใ†ๆ“ไฝœใ ใฃใŸใจใ„ใ†ใ“ใจใซใชใ‚‹ใ€‚

ใจใ“ใ‚ใงใ€(a >> 2) ใฎใจใ“ใ‚ใ ใ‘1ใƒ“ใƒƒใƒˆใ ใ‘ๅ˜็‹ฌใงไฝฟใฃใฆใŠใ‚Šใ€ไธ€่ฆ‹ใƒ‘ใ‚ฟใƒผใƒณใซๆฒฟใฃใฆใ„ใชใ„ใ‚ˆใ†ใซ่ฆ‹ใˆใ‚‹ใ€‚
ใ—ใ‹ใ—ใ€ใ“ใ“ใพใงใฏ่ถณใ—็ฎ—ใ€ใ“ใฎๅพŒใฏๅผ•ใ็ฎ—ใงใ‚ใ‚‹ใ€‚
1ใƒ“ใƒƒใƒˆใ ใ‘ๅ˜็‹ฌใง็ซ‹ใฃใฆใ„ใ‚‹ใจใ“ใ‚ใ‹ใ‚‰ใ€ใใฎไธ‹ใฎ2ใƒ“ใƒƒใƒˆ้€ฃ็ถšใงไฝฟใ†ใจใ“ใ‚ใ‚’ๅผ•ใใจใ€

  11010000
-       11
----------
  11001101

ใจใชใ‚Šใ€ใ€Œ2ใƒ“ใƒƒใƒˆ้€ฃ็ถšใ€ใŒ1ใ‚ปใƒƒใƒˆๅข—ใˆใ€ใใฎไธ‹ใซๆ–ฐใ—ใ„ใ€Œ1ใƒ“ใƒƒใƒˆใ ใ‘ๅ˜็‹ฌใ€ใŒๅข—ใˆใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚‹ใ€‚
2ใƒ“ใƒƒใƒˆใฎ้€ฃ็ถšใ‚’ๅผ•ใใจ็ฒพๅบฆใŒไธŠใŒใฃใŸใฎใฏใ€ใ“ใฎใ‚ˆใ†ใซใƒ‘ใ‚ฟใƒผใƒณใ‚’ไผธใฐใ™ๅŠนๆžœใŒใ‚ใฃใŸใ‹ใ‚‰ใ ใ‚ใ†ใ€‚

ใ•ใฆใ€ใ€Œ2ใƒ“ใƒƒใƒˆ้€ฃ็ถšใ€ใ‚’ๅผ•ใใ“ใจใงใƒ‘ใ‚ฟใƒผใƒณใ‚’ไผธใฐใ›ใ‚‹ใชใ‚‰ใ€ใ‚‚ใฃใจไธŠไฝใ‹ใ‚‰ใ“ใ‚Œใ‚’็”จใ„ใฆใƒ‘ใ‚ฟใƒผใƒณใ‚’ไผธใฐใ—ใฆใ‚‚ใ‚ˆใ„ใ ใ‚ใ†ใ€‚
ใคใ„ใงใซใ€ใ€Œ2ใƒ“ใƒƒใƒˆ้€ฃ็ถšใ€ใ‚’ใƒใƒฉใƒใƒฉใซๆ›ธใ‹ใšใ€ใพใจใ‚ใฆๅ‡ฆ็†ใ—ใ‚ˆใ†ใ€‚

unsigned int div10(unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	return (
		((unsigned long long)a << 10) - (a3 << 6) - (a3 << 2) - (a3 >> 2)
		- (a3 >> 6) - (a3 >> 10) - (a3 >> 14) - (a3 >> 18) - (a3 >> 22)
	) >> 13;
}

ใ“ใ‚Œใงใ‚‚ใ€32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใฎๅ…จ็ฏ„ๅ›ฒใงๆญฃใ—ใ„ๅ€คใ‚’ๅพ—ใ‚‹ใ“ใจใŒใงใใŸใ€‚

ใ‚ทใƒ•ใƒˆใฎๅน…ใ‚’ๆธ›ใ‚‰ใ™

ๆœ€ๅˆใฏใ€ๅ้€ฒๆ•ฐใงใฟใฆใ‚ˆใ•ใใ†ใชๆ€ง่ณชใŒ่ฆ‹ใˆใŸใ€Œ819.25ใ‚’ๆŽ›ใ‘ใฆ8192ใงๅ‰ฒใ‚‹ใ€ใ‚’็”จใ„ใŸใŒใ€ไบŒ้€ฒๆ•ฐใงใฎใƒ‘ใ‚ฟใƒผใƒณใŒ่ฆ‹ใˆใŸไปŠใงใฏใ€Œ8192ใงๅ‰ฒใ‚‹ใ€ใซใ“ใ ใ‚ใ‚‰ใชใใฆ่‰ฏใ•ใใ†ใงใ‚ใ‚‹ใ€‚
ใ‚‚ใ†ๅฐ‘ใ—ๅฐใ•ใ„ๅ€คใงๅ‰ฒใ‚‹ใ‚ˆใ†ใซใ—ใฆใ‚‚ใ€็ฒพๅบฆใ‚’็ขบไฟใงใใ‚‹ใ ใ‚ใ†ใ‹๏ผŸ

ใŸใจใˆใฐใ€ใ‚ทใƒ•ใƒˆๅน…ใ‚’1ใƒใ‚คใƒˆๆจใฆใ‚‹ใ ใ‘ใงๅฎŸ็พใงใใ‚‹ 8 ใซใ—ใฆใฟใŸใ€‚

unsigned int div10(unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	return (
		((unsigned long long)a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7)
		- (a3 >> 11) - (a3 >> 15) - (a3 >> 19) - (a3 >> 23) - (a3 >> 27)
	) >> 8;
}

ใ“ใ‚Œใงใ‚‚ใ€32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใฎๅ…จ็ฏ„ๅ›ฒใงๆญฃใ—ใ„ๅ€คใ‚’ๅพ—ใ‚‹ใ“ใจใŒใงใใŸใ€‚

ใ‚ทใƒ•ใƒˆๅน…ใ‚’ 7 ใซใ™ใ‚‹ใจใ€้€”ไธญใฎๅ€คใซๅฏพใ™ใ‚‹ใ‚ทใƒ•ใƒˆใฎๅน…ใŒ 4 ใฎๅ€ๆ•ฐใซใชใ‚Šใ€ใใ‚Œใ„ใงใ‚ใ‚‹ใ€‚

unsigned int div10(unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	return (
		((unsigned long long)a << 4) - a3 - (a3 >> 4) - (a3 >> 8)
		- (a3 >> 12) - (a3 >> 16) - (a3 >> 20) - (a3 >> 24) - (a3 >> 28)
	) >> 7;
}

ใ“ใ‚Œใงใ‚‚ใ€32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใฎๅ…จ็ฏ„ๅ›ฒใงๆญฃใ—ใ„ๅ€คใ‚’ๅพ—ใ‚‹ใ“ใจใŒใงใใŸใ€‚

ใ‚ทใƒ•ใƒˆๅน…ใ‚’ใ•ใ‚‰ใซใ‚‚ใ†1ใƒ“ใƒƒใƒˆๅ‰Šใฃใฆใฟใ‚‹ใ€‚

unsigned int div10(unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	return (
		((unsigned long long)a << 3) - (a3 >> 1) - (a3 >> 5) - (a3 >> 9)
		- (a3 >> 13) - (a3 >> 17) - (a3 >> 21) - (a3 >> 25) - (a3 >> 29)
	) >> 6;
}
9786709 -> 978671

ใ•ใ™ใŒใซๅ‰Šใ‚Šใ™ใŽใŸใ‚ˆใ†ใงใ‚ใ‚‹ใ€‚

็›ฎๆจ™ใ‚’16ใƒ“ใƒƒใƒˆใซไธ‹ใ’ใ‚Œใฐใ€ใ“ใ‚Œใงๅๅˆ†ใงใ‚ใ‚‹ใ€‚

unsigned int div10(unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	return (
		((unsigned long long)a << 3) - (a3 >> 1) - (a3 >> 5) - (a3 >> 9) - (a3 >> 13)
	) >> 6;
}
120149 -> 12015

ใ‚‚ใ†1ใƒ“ใƒƒใƒˆๅ‰Šใ‚‹ใจใ€ใ‹ใชใ‚Šๅฝน็ซ‹ใŸใชใใชใฃใฆใใŸใ€‚
ใ“ใ†ใชใ‚‹ใจใ€ๅผ•ใ้ …ใฎๆ•ฐใ‚’ๅข—ใ‚„ใ—ใฆใ‚‚ใ€็ฒพๅบฆใฏไผธใณใชใ„ใ‚ˆใ†ใงใ‚ใ‚‹ใ€‚

unsigned int div10(unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	return (((unsigned long long)a << 2) - (a3 >> 2) - (a3 >> 6) - (a3 >> 10)) >> 5;
}
2389 -> 239

10ใงๅ‰ฒใฃใŸไฝ™ใ‚Šใ‚’ๆฑ‚ใ‚ใ‚‹

ไปŠๅ›žใฎๆ–นๆณ•ใงใ€32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใ‚’10ใงๅ‰ฒใฃใŸๅ•†ใ‚’ๆฑ‚ใ‚ใ‚‹ใ“ใจใŒใงใใŸใ€‚
ใ—ใ‹ใ—ใ€ไบŒ้€ฒๆ•ฐใ‚’ๅ้€ฒๆ•ฐใซๅค‰ๆ›ใ™ใ‚‹ๅ‡ฆ็†ใงใฏใ€10ใงๅ‰ฒใฃใŸไฝ™ใ‚Šใ‚‚ๆฌฒใ—ใ„ใ€‚
ใใ“ใงใ€ๆœ€ๅพŒใฎๅณใ‚ทใƒ•ใƒˆใงๆจใฆใ‚‰ใ‚Œใ‚‹ๆƒ…ๅ ฑใ‹ใ‚‰ใ€10ใงๅ‰ฒใฃใŸไฝ™ใ‚ŠใŒๅพ—ใ‚‰ใ‚Œใชใ„ใ‹ใ‚’่€ƒใˆใฆใฟใ‚‹ใ€‚

ใ‚ทใƒ•ใƒˆๅน…ใ‚’8ใƒ“ใƒƒใƒˆใซใ—ใŸใƒใƒผใ‚ธใƒงใƒณใฎใƒ—ใƒญใ‚ฐใƒฉใƒ ใ‚’ๅค‰ๆ›ดใ—ใ€10ใงๅ‰ฒใฃใŸไฝ™ใ‚Šใจใ€Œๆœ€ๅพŒใฎๅณใ‚ทใƒ•ใƒˆใงๆจใฆใ‚‰ใ‚Œใ‚‹ๆƒ…ๅ ฑใ€ใฎ้–ขไฟ‚ใ‚’่ฆณๅฏŸใ—ใฆใฟใ‚‹ใ€‚

#include <stdio.h>
#include <limits.h>

unsigned int div10(unsigned int *dropped, unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	unsigned long long value =
		((unsigned long long)a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7)
		- (a3 >> 11) - (a3 >> 15) - (a3 >> 19) - (a3 >> 23) - (a3 >> 27);
	*dropped = value & 0xff;
	return value >> 8;
}

unsigned int dropped_count[10][256];

int main(void) {
	for (unsigned int i = 0; ; i++) {
		unsigned int res, dropped;
		res = div10(&dropped, i);
		dropped_count[i % 10][dropped]++;
		if (res != i / 10) {
			printf("%u -> %u\n", i, res);
			break;
		}
		if (i == UINT_MAX) break;
	}
	for (int a = 0; a < 256; a++) {
		printf("%3d %02x", a, a);
		for (int b = 0; b < 10; b++) {
			printf("%10u", dropped_count[b][a]);
		}
		putchar('\n');
	}
	return 0;
}

ไปฅไธ‹ใฎๅฎŸ่กŒ็ตๆžœใŒๅพ—ใ‚‰ใ‚ŒใŸใ€‚

ๅฎŸ่กŒ็ตๆžœ
  0 00         1         0         0         0         0         0         0         0         0         0
  1 01     68440         0         0         0         0         0         0         0         0         0
  2 02   3079000         0         0         0         0         0         0         0         0         0
  3 03  22056812         0         0         0         0         0         0         0         0         0
  4 04  52269164         0         0         0         0         0         0         0         0         0
  5 05  65706336         0         0         0         0         0         0         0         0         0
  6 06  67094688         0         0         0         0         0         0         0         0         0
  7 07  67103390         0         0         0         0         0         0         0         0         0
  8 08  66210966         0         0         0         0         0         0         0         0         0
  9 09  55320624         0         0         0         0         0         0         0         0         0
 10 0a  26102512         0         0         0         0         0         0         0         0         0
 11 0b   4351265         0         0         0         0         0         0         0         0         0
 12 0c    133504         0         0         0         0         0         0         0         0         0
 13 0d        28         0         0         0         0         0         0         0         0         0
 14 0e         0         0         0         0         0         0         0         0         0         0
 15 0f         0         0         0         0         0         0         0         0         0         0
 16 10         0         0         0         0         0         0         0         0         0         0
 17 11         0         0         0         0         0         0         0         0         0         0
 18 12         0         0         0         0         0         0         0         0         0         0
 19 13         0         0         0         0         0         0         0         0         0         0
 20 14         0         0         0         0         0         0         0         0         0         0
 21 15         0         0         0         0         0         0         0         0         0         0
 22 16         0         0         0         0         0         0         0         0         0         0
 23 17         0         0         0         0         0         0         0         0         0         0
 24 18         0         0         0         0         0         0         0         0         0         0
 25 19         0         0         0         0         0         0         0         0         0         0
 26 1a         0       211         0         0         0         0         0         0         0         0
 27 1b         0    244952         0         0         0         0         0         0         0         0
 28 1c         0   5975796         0         0         0         0         0         0         0         0
 29 1d         0  30327768         0         0         0         0         0         0         0         0
 30 1e         0  57957875         0         0         0         0         0         0         0         0
 31 1f         0  66556472         0         0         0         0         0         0         0         0
 32 20         0  67107064         0         0         0         0         0         0         0         0
 33 21         0  67076258         0         0         0         0         0         0         0         0
 34 22         0  64996010         0         0         0         0         0         0         0         0
 35 23         0  48829888         0         0         0         0         0         0         0         0
 36 24         0  18278976         0         0         0         0         0         0         0         0
 37 25         0   2112854         0         0         0         0         0         0         0         0
 38 26         0     32606         0         0         0         0         0         0         0         0
 39 27         0         0         0         0         0         0         0         0         0         0
 40 28         0         0         0         0         0         0         0         0         0         0
 41 29         0         0         0         0         0         0         0         0         0         0
 42 2a         0         0         0         0         0         0         0         0         0         0
 43 2b         0         0         0         0         0         0         0         0         0         0
 44 2c         0         0         0         0         0         0         0         0         0         0
 45 2d         0         0         0         0         0         0         0         0         0         0
 46 2e         0         0         0         0         0         0         0         0         0         0
 47 2f         0         0         0         0         0         0         0         0         0         0
 48 30         0         0         0         0         0         0         0         0         0         0
 49 31         0         0         0         0         0         0         0         0         0         0
 50 32         0         0         0         0         0         0         0         0         0         0
 51 33         0         0         0         0         0         0         0         0         0         0
 52 34         0         0     21778         0         0         0         0         0         0         0
 53 35         0         0   1728896         0         0         0         0         0         0         0
 54 36         0         0  16513408         0         0         0         0         0         0         0
 55 37         0         0  46979340         0         0         0         0         0         0         0
 56 38         0         0  64548102         0         0         0         0         0         0         0
 57 39         0         0  67061144         0         0         0         0         0         0         0
 58 3a         0         0  67107912         0         0         0         0         0         0         0
 59 3b         0         0  66682584         0         0         0         0         0         0         0
 60 3c         0         0  59119013         0         0         0         0         0         0         0
 61 3d         0         0  32476656         0         0         0         0         0         0         0
 62 3e         0         0   6932284         0         0         0         0         0         0         0
 63 3f         0         0    325144         0         0         0         0         0         0         0
 64 40         0         0       469         0         0         0         0         0         0         0
 65 41         0         0         0         0         0         0         0         0         0         0
 66 42         0         0         0         0         0         0         0         0         0         0
 67 43         0         0         0         0         0         0         0         0         0         0
 68 44         0         0         0         0         0         0         0         0         0         0
 69 45         0         0         0         0         0         0         0         0         0         0
 70 46         0         0         0         0         0         0         0         0         0         0
 71 47         0         0         0         0         0         0         0         0         0         0
 72 48         0         0         0         0         0         0         0         0         0         0
 73 49         0         0         0         0         0         0         0         0         0         0
 74 4a         0         0         0         0         0         0         0         0         0         0
 75 4b         0         0         0         0         0         0         0         0         0         0
 76 4c         0         0         0         0         0         0         0         0         0         0
 77 4d         0         0         0         7         0         0         0         0         0         0
 78 4e         0         0         0     96384         0         0         0         0         0         0
 79 4f         0         0         0   3673832         0         0         0         0         0         0
 80 50         0         0         0  24051344         0         0         0         0         0         0
 81 51         0         0         0  53845556         0         0         0         0         0         0
 82 52         0         0         0  65981338         0         0         0         0         0         0
 83 53         0         0         0  67099904         0         0         0         0         0         0
 84 54         0         0         0  67099904         0         0         0         0         0         0
 85 55         0         0         0  65981338         0         0         0         0         0         0
 86 56         0         0         0  53845556         0         0         0         0         0         0
 87 57         0         0         0  24051344         0         0         0         0         0         0
 88 58         0         0         0   3673832         0         0         0         0         0         0
 89 59         0         0         0     96384         0         0         0         0         0         0
 90 5a         0         0         0         7         0         0         0         0         0         0
 91 5b         0         0         0         0         0         0         0         0         0         0
 92 5c         0         0         0         0         0         0         0         0         0         0
 93 5d         0         0         0         0         0         0         0         0         0         0
 94 5e         0         0         0         0         0         0         0         0         0         0
 95 5f         0         0         0         0         0         0         0         0         0         0
 96 60         0         0         0         0         0         0         0         0         0         0
 97 61         0         0         0         0         0         0         0         0         0         0
 98 62         0         0         0         0         0         0         0         0         0         0
 99 63         0         0         0         0         0         0         0         0         0         0
100 64         0         0         0         0         0         0         0         0         0         0
101 65         0         0         0         0         0         0         0         0         0         0
102 66         0         0         0         0         0         0         0         0         0         0
103 67         0         0         0         0      5474         0         0         0         0         0
104 68         0         0         0         0    897898         0         0         0         0         0
105 69         0         0         0         0  11788240         0         0         0         0         0
106 6a         0         0         0         0  41006352         0         0         0         0         0
107 6b         0         0         0         0  62757599         0         0         0         0         0
108 6c         0         0         0         0  66975360         0         0         0         0         0
109 6d         0         0         0         0  67108752         0         0         0         0         0
110 6e         0         0         0         0  66926744         0         0         0         0         0
111 6f         0         0         0         0  61991961         0         0         0         0         0
112 70         0         0         0         0  38910104         0         0         0         0         0
113 71         0         0         0         0  10417072         0         0         0         0         0
114 72         0         0         0         0    707960         0         0         0         0         0
115 73         0         0         0         0      3214         0         0         0         0         0
116 74         0         0         0         0         0         0         0         0         0         0
117 75         0         0         0         0         0         0         0         0         0         0
118 76         0         0         0         0         0         0         0         0         0         0
119 77         0         0         0         0         0         0         0         0         0         0
120 78         0         0         0         0         0         0         0         0         0         0
121 79         0         0         0         0         0         0         0         0         0         0
122 7a         0         0         0         0         0         0         0         0         0         0
123 7b         0         0         0         0         0         0         0         0         0         0
124 7c         0         0         0         0         0         0         0         0         0         0
125 7d         0         0         0         0         0         0         0         0         0         0
126 7e         0         0         0         0         0         0         0         0         0         0
127 7f         0         0         0         0         0         0         0         0         0         0
128 80         0         0         0         0         0         0         0         0         0         0
129 81         0         0         0         0         0     32606         0         0         0         0
130 82         0         0         0         0         0   2112854         0         0         0         0
131 83         0         0         0         0         0  18278976         0         0         0         0
132 84         0         0         0         0         0  48829888         0         0         0         0
133 85         0         0         0         0         0  64996010         0         0         0         0
134 86         0         0         0         0         0  67076258         0         0         0         0
135 87         0         0         0         0         0  67107064         0         0         0         0
136 88         0         0         0         0         0  66556472         0         0         0         0
137 89         0         0         0         0         0  57957875         0         0         0         0
138 8a         0         0         0         0         0  30327768         0         0         0         0
139 8b         0         0         0         0         0   5975796         0         0         0         0
140 8c         0         0         0         0         0    244952         0         0         0         0
141 8d         0         0         0         0         0       211         0         0         0         0
142 8e         0         0         0         0         0         0         0         0         0         0
143 8f         0         0         0         0         0         0         0         0         0         0
144 90         0         0         0         0         0         0         0         0         0         0
145 91         0         0         0         0         0         0         0         0         0         0
146 92         0         0         0         0         0         0         0         0         0         0
147 93         0         0         0         0         0         0         0         0         0         0
148 94         0         0         0         0         0         0         0         0         0         0
149 95         0         0         0         0         0         0         0         0         0         0
150 96         0         0         0         0         0         0         0         0         0         0
151 97         0         0         0         0         0         0         0         0         0         0
152 98         0         0         0         0         0         0         0         0         0         0
153 99         0         0         0         0         0         0         0         0         0         0
154 9a         0         0         0         0         0         0       952         0         0         0
155 9b         0         0         0         0         0         0    426280         0         0         0
156 9c         0         0         0         0         0         0   7989851         0         0         0
157 9d         0         0         0         0         0         0  34632208         0         0         0
158 9e         0         0         0         0         0         0  60176580         0         0         0
159 9f         0         0         0         0         0         0  66783720         0         0         0
160 a0         0         0         0         0         0         0  67108394         0         0         0
161 a1         0         0         0         0         0         0  67040424         0         0         0
162 a2         0         0         0         0         0         0  64029864         0         0         0
163 a3         0         0         0         0         0         0  45052052         0         0         0
164 a4         0         0         0         0         0         0  14839700         0         0         0
165 a5         0         0         0         0         0         0   1402528         0         0         0
166 a6         0         0         0         0         0         0     14176         0         0         0
167 a7         0         0         0         0         0         0         0         0         0         0
168 a8         0         0         0         0         0         0         0         0         0         0
169 a9         0         0         0         0         0         0         0         0         0         0
170 aa         0         0         0         0         0         0         0         0         0         0
171 ab         0         0         0         0         0         0         0         0         0         0
172 ac         0         0         0         0         0         0         0         0         0         0
173 ad         0         0         0         0         0         0         0         0         0         0
174 ae         0         0         0         0         0         0         0         0         0         0
175 af         0         0         0         0         0         0         0         0         0         0
176 b0         0         0         0         0         0         0         0         0         0         0
177 b1         0         0         0         0         0         0         0         0         0         0
178 b2         0         0         0         0         0         0         0         0         0         0
179 b3         0         0         0         0         0         0         0         0         0         0
180 b4         0         0         0         0         0         0         0      8960         0         0
181 b5         0         0         0         0         0         0         0   1127526         0         0
182 b6         0         0         0         0         0         0         0  13263308         0         0
183 b7         0         0         0         0         0         0         0  43057520         0         0
184 b8         0         0         0         0         0         0         0  63435032         0         0
185 b9         0         0         0         0         0         0         0  67012480         0         0
186 ba         0         0         0         0         0         0         0  67108646         0         0
187 bb         0         0         0         0         0         0         0  66863912         0         0
188 bc         0         0         0         0         0         0         0  61133068         0         0
189 bd         0         0         0         0         0         0         0  36781096         0         0
190 be         0         0         0         0         0         0         0   9150989         0         0
191 bf         0         0         0         0         0         0         0    552392         0         0
192 c0         0         0         0         0         0         0         0      1800         0         0
193 c1         0         0         0         0         0         0         0         0         0         0
194 c2         0         0         0         0         0         0         0         0         0         0
195 c3         0         0         0         0         0         0         0         0         0         0
196 c4         0         0         0         0         0         0         0         0         0         0
197 c5         0         0         0         0         0         0         0         0         0         0
198 c6         0         0         0         0         0         0         0         0         0         0
199 c7         0         0         0         0         0         0         0         0         0         0
200 c8         0         0         0         0         0         0         0         0         0         0
201 c9         0         0         0         0         0         0         0         0         0         0
202 ca         0         0         0         0         0         0         0         0         0         0
203 cb         0         0         0         0         0         0         0         0         0         0
204 cc         0         0         0         0         0         0         0         0         0         0
205 cd         0         0         0         0         0         0         0         0        84         0
206 ce         0         0         0         0         0         0         0         0    182120         0
207 cf         0         0         0         0         0         0         0         0   5116903         0
208 d0         0         0         0         0         0         0         0         0  28198760         0
209 d1         0         0         0         0         0         0         0         0  56691792         0
210 d2         0         0         0         0         0         0         0         0  66400904         0
211 d3         0         0         0         0         0         0         0         0  67105650         0
212 d4         0         0         0         0         0         0         0         0  67087086         0
213 d5         0         0         0         0         0         0         0         0  65379968         0
214 d6         0         0         0         0         0         0         0         0  50595456         0
215 d7         0         0         0         0         0         0         0         0  20129524         0
216 d8         0         0         0         0         0         0         0         0   2560762         0
217 d9         0         0         0         0         0         0         0         0     47720         0
218 da         0         0         0         0         0         0         0         0         0         0
219 db         0         0         0         0         0         0         0         0         0         0
220 dc         0         0         0         0         0         0         0         0         0         0
221 dd         0         0         0         0         0         0         0         0         0         0
222 de         0         0         0         0         0         0         0         0         0         0
223 df         0         0         0         0         0         0         0         0         0         0
224 e0         0         0         0         0         0         0         0         0         0         0
225 e1         0         0         0         0         0         0         0         0         0         0
226 e2         0         0         0         0         0         0         0         0         0         0
227 e3         0         0         0         0         0         0         0         0         0         0
228 e4         0         0         0         0         0         0         0         0         0         0
229 e5         0         0         0         0         0         0         0         0         0         0
230 e6         0         0         0         0         0         0         0         0         0         0
231 e7         0         0         0         0         0         0         0         0         0      1800
232 e8         0         0         0         0         0         0         0         0         0    552392
233 e9         0         0         0         0         0         0         0         0         0   9150989
234 ea         0         0         0         0         0         0         0         0         0  36781096
235 eb         0         0         0         0         0         0         0         0         0  61133068
236 ec         0         0         0         0         0         0         0         0         0  66863912
237 ed         0         0         0         0         0         0         0         0         0  67108646
238 ee         0         0         0         0         0         0         0         0         0  67012480
239 ef         0         0         0         0         0         0         0         0         0  63435032
240 f0         0         0         0         0         0         0         0         0         0  43057520
241 f1         0         0         0         0         0         0         0         0         0  13263308
242 f2         0         0         0         0         0         0         0         0         0   1127526
243 f3         0         0         0         0         0         0         0         0         0      8960
244 f4         0         0         0         0         0         0         0         0         0         0
245 f5         0         0         0         0         0         0         0         0         0         0
246 f6         0         0         0         0         0         0         0         0         0         0
247 f7         0         0         0         0         0         0         0         0         0         0
248 f8         0         0         0         0         0         0         0         0         0         0
249 f9         0         0         0         0         0         0         0         0         0         0
250 fa         0         0         0         0         0         0         0         0         0         0
251 fb         0         0         0         0         0         0         0         0         0         0
252 fc         0         0         0         0         0         0         0         0         0         0
253 fd         0         0         0         0         0         0         0         0         0         0
254 fe         0         0         0         0         0         0         0         0         0         0
255 ff         0         0         0         0         0         0         0         0         0         0

ใ“ใฎๅฎŸ่กŒ็ตๆžœใฎ่กŒใŒใ€Œๆœ€ๅพŒใฎๅณใ‚ทใƒ•ใƒˆใงๆจใฆใ‚‰ใ‚Œใ‚‹ๆƒ…ๅ ฑใ€ใ€ๅˆ—ใŒ10ใงๅ‰ฒใฃใŸไฝ™ใ‚Šใซๅฏพๅฟœใ—ใฆใ„ใ‚‹ใ€‚
ใ“ใฎๅฎŸ่กŒ็ตๆžœใ‚’่ฆ‹ใ‚‹ใจใ€ๅ…ฅๅŠ›ใŒ32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใฎใจใใ€้ƒฝๅˆใ‚ˆใใ€Œๆœ€ๅพŒใฎๅณใ‚ทใƒ•ใƒˆใงๆจใฆใ‚‰ใ‚Œใ‚‹ๆƒ…ๅ ฑใ€ใฎไธŠไฝ4ใƒ“ใƒƒใƒˆใ ใ‘ใ‚’่ฆ‹ใ‚Œใฐ10ใงๅ‰ฒใฃใŸไฝ™ใ‚Šใ‚’ๆฑ‚ใ‚ใ‚‹ใ“ใจใŒใงใใใ†ใชใ“ใจใŒใ‚ใ‹ใ‚‹ใ€‚
ใจใ„ใ†ใ‹ใ€ใ“ใฎ้ƒจๅˆ†ใฏๅ…ฅๅŠ›ใฎๅ€คใซ 0.1 ใ‚’ๆŽ›ใ‘ใŸใจใใฎๅฐๆ•ฐ้ƒจๅˆ†ใซ็›ธๅฝ“ใ™ใ‚‹ใฎใงใ€10ใ‚’ๆŽ›ใ‘ใฆๅŒๆง˜ใซๅณใ‚ทใƒ•ใƒˆใ‚’ใ™ใ‚‹ใ“ใจใงไฝ™ใ‚ŠใŒๅพ—ใ‚‰ใ‚Œใใ†ใ ใ€‚
ใ“ใฎๅ‡ฆ็†ใ‚’็ต„ใฟ่พผใ‚“ใงใฟใ‚ˆใ†ใ€‚

#include <stdio.h>
#include <limits.h>

unsigned int div10(unsigned int *rem, unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	unsigned long long value =
		((unsigned long long)a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7)
		- (a3 >> 11) - (a3 >> 15) - (a3 >> 19) - (a3 >> 23) - (a3 >> 27);
	*rem = ((value & 0xff) * 10) >> 8;
	return value >> 8;
}

int main(void) {
	for (unsigned int i = 0; ; i++) {
		unsigned int res, rem;
		res = div10(&rem, i);
		if (res != i / 10 || rem != i % 10) {
			printf("%u -> %u, %u\n", i, res, rem);
			break;
		}
		if (i == UINT_MAX) break;
	}
	return 0;
}

็ตๆžœใฏไฝ•ใ‚‚ๅ‡บๅŠ›ใ•ใ‚Œใšใ€ไปปๆ„ใฎ32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐใซใคใ„ใฆๆญฃใ—ใ„10ใงๅ‰ฒใฃใŸๅ•†ใจไฝ™ใ‚ŠใŒๆฑ‚ใพใ‚‹ใ“ใจใŒใ‚ใ‹ใฃใŸใ€‚
1ๅ€‹ใ ใ‘ๆŽ›ใ‘็ฎ—ใ‚’ไฝฟใฃใฆใ„ใ‚‹ใฎใฏใ‚ซใƒƒใ‚ณๆ‚ชใ„ใฎใงใ€ใ‚ทใƒ•ใƒˆใจ่ถณใ—็ฎ—ใซๅค‰ๆ›ใ—ใฆใŠใ“ใ†ใ€‚

unsigned int div10(unsigned int *rem, unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	unsigned long long value =
		((unsigned long long)a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7)
		- (a3 >> 11) - (a3 >> 15) - (a3 >> 19) - (a3 >> 23) - (a3 >> 27);
	unsigned int rem_work = value & 0xff;
	*rem = (rem_work + (rem_work << 2)) >> 7;
	return value >> 8;
}

็ต่ซ–

ไปฅไธ‹ใฎ้–ขๆ•ฐใงใ€ไปปๆ„ใฎ32ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐ (ๅฐ‘ใชใใจใ‚‚ UINT_MAX ไปฅไธ‹) ใ‚’10ใงๅ‰ฒใฃใŸๅ•†ใจไฝ™ใ‚Šใ‚’ๆฑ‚ใ‚ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚

unsigned int div10(unsigned int *rem, unsigned int a) {
	unsigned long long a3 = ((unsigned long long)a << 1) + a;
	unsigned long long value =
		((unsigned long long)a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7)
		- (a3 >> 11) - (a3 >> 15) - (a3 >> 19) - (a3 >> 23) - (a3 >> 27);
	unsigned int rem_work = value & 0xff;
	*rem = (rem_work + (rem_work << 2)) >> 7;
	return value >> 8;
}

ไปฅไธ‹ใฎ้–ขๆ•ฐใงใ€ไปปๆ„ใฎ24ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐ (54,351,188 ไปฅไธ‹) ใ‚’10ใงๅ‰ฒใฃใŸๅ•†ใจไฝ™ใ‚Šใ‚’ๆฑ‚ใ‚ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚

unsigned int div10(unsigned int *rem, unsigned int a) {
	unsigned int a3 = (a << 1) + a;
	unsigned int value =
		(a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7)
		- (a3 >> 11) - (a3 >> 15) - (a3 >> 19);
	unsigned int rem_work = value & 0xff;
	*rem = (rem_work + (rem_work << 2)) >> 7;
	return value >> 8;
}

ไปฅไธ‹ใฎ้–ขๆ•ฐใงใ€ไปปๆ„ใฎ16ใƒ“ใƒƒใƒˆ็ฌฆๅทใชใ—ๆ•ดๆ•ฐ (232,788 ไปฅไธ‹) ใ‚’10ใงๅ‰ฒใฃใŸๅ•†ใจไฝ™ใ‚Šใ‚’ๆฑ‚ใ‚ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚

unsigned int div10(unsigned int *rem, unsigned int a) {
	unsigned int a3 = (a << 1) + a;
	unsigned int value = (a << 5) - (a3 << 1) - (a3 >> 3) - (a3 >> 7) - (a3 >> 11);
	unsigned int rem_work = value & 0xff;
	*rem = (rem_work + (rem_work << 2)) >> 7;
	return value >> 8;
}

ใŠใพใ‘๏ผšGCC ใซใ‚ˆใ‚‹ใ€Œ10ใงๅ‰ฒใ‚‹ใ€ใฎ่กจ็พ

Compiler Explorer ใ‚’็”จใ„ใฆใ€GCC ใŒ10 ใงๅ‰ฒใฃใŸๅ•†ใจไฝ™ใ‚Šใ‚’ใฉใ†่กจ็พใ™ใ‚‹ใ‹ใ‚’่ฆ‹ใฆใฟใŸใ€‚
ไปฅไธ‹ใฎใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใจใ—ใ€-O2 ใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚’ใคใ‘ใฆใ‚ณใƒณใƒ‘ใ‚คใƒซใ—ใŸใ€‚

unsigned int div10(unsigned int a) {
    return a / 10;
}

unsigned int mod10(unsigned int a) {
    return a % 10;
}

x86-64 gcc 14.2

div10:
        movl    %edi, %eax
        movl    $3435973837, %edx
        imulq   %rdx, %rax
        shrq    $35, %rax
        ret
mod10:
        movl    %edi, %eax
        movl    $3435973837, %edx
        imulq   %rdx, %rax
        shrq    $35, %rax
        leal    (%rax,%rax,4), %edx
        movl    %edi, %eax
        addl    %edx, %edx
        subl    %edx, %eax
        ret

ๅ•†ใฏๅ…ฅๅŠ›ใซใƒžใ‚ธใƒƒใ‚ฏใƒŠใƒณใƒใƒผใ‚’ๆŽ›ใ‘ใฆ35ใƒ“ใƒƒใƒˆๅณใ‚ทใƒ•ใƒˆใ™ใ‚‹ใ“ใจใงใ€ไฝ™ใ‚Šใฏๅ…ฅๅŠ›ใ‹ใ‚‰ๅ•†ใฎ10ๅ€ใ‚’ๅผ•ใใ“ใจใงๆฑ‚ใ‚ใฆใ„ใ‚‹ใ€‚
ใƒžใ‚ธใƒƒใ‚ฏใƒŠใƒณใƒใƒผใฎ 3435973837 ใ‚’ไบŒ้€ฒๆ•ฐใง่กจใ™ใจ 11001100110011001100110011001101 ใจใชใ‚Šใ€ใƒ‘ใ‚ฟใƒผใƒณใซๆฒฟใฃใฆใ„ใ‚‹ใ‚‰ใ—ใ„ใ“ใจใŒใ‚ใ‹ใ‚‹ใ€‚

ARM GCC 14.2.0

div10:
        movw    r3, #52429
        movt    r3, 52428
        umull   r3, r0, r3, r0
        lsrs    r0, r0, #3
        bx      lr
mod10:
        movw    r3, #52429
        movt    r3, 52428
        movs    r2, #10
        umull   r1, r3, r3, r0
        lsrs    r3, r3, #3
        mls     r0, r2, r3, r0
        bx      lr

ใ€Œใƒžใ‚ธใƒƒใ‚ฏใƒŠใƒณใƒใƒผใ‚’ๆŽ›ใ‘ใฆ35ใƒ“ใƒƒใƒˆๅณใ‚ทใƒ•ใƒˆใ™ใ‚‹ใ€ใ€Œไฝ™ใ‚Šใฏๅ…ฅๅŠ›ใ‹ใ‚‰ๅ•†ใฎ10ๅ€ใ‚’ๅผ•ใ„ใฆๆฑ‚ใ‚ใ‚‹ใ€ๆ–น้‡ใฎใ‚ˆใ†ใงใ‚ใ‚‹ใ€‚

ๅ„ๅ‘ฝไปคใฎๆ„ๅ‘ณใฏใ€ไปฅไธ‹ใฎใ‚‚ใฎใงใ‚ใ‚‹ใ€‚

ๅ‘ฝไปค ๆ„ๅ‘ณ
movw a, b a โ† b
movt a, b a โ† (a & 0xffff) | (b << 16)
umull a, b, c, d b:a โ† c * d
lsrs a, b, c a โ† b >> c (่ซ–็†ใ‚ทใƒ•ใƒˆ)
mls a, b, c, d a โ† d - b * c

ๅ‚่€ƒ๏ผš

RISC-V (32-bits) gcc 14.2.0

div10:
        li      a5,-858992640
        addi    a5,a5,-819
        mulhu   a0,a0,a5
        srli    a0,a0,3
        ret
mod10:
        li      a5,-858992640
        addi    a5,a5,-819
        mulhu   a5,a0,a5
        srli    a5,a5,3
        slli    a4,a5,2
        add     a5,a4,a5
        slli    a5,a5,1
        sub     a0,a0,a5
        ret

ใ€Œใƒžใ‚ธใƒƒใ‚ฏใƒŠใƒณใƒใƒผใ‚’ๆŽ›ใ‘ใฆ35ใƒ“ใƒƒใƒˆๅณใ‚ทใƒ•ใƒˆใ™ใ‚‹ใ€ใ€Œไฝ™ใ‚Šใฏๅ…ฅๅŠ›ใ‹ใ‚‰ๅ•†ใฎ10ๅ€ใ‚’ๅผ•ใ„ใฆๆฑ‚ใ‚ใ‚‹ใ€ๆ–น้‡ใฎใ‚ˆใ†ใงใ‚ใ‚‹ใ€‚
ๅ€ค -858992640 ใ‚’ๅๅ…ญ้€ฒๆ•ฐ (2ใฎ่ฃœๆ•ฐ) ใง่กจใ™ใจ 0xccccd000 ใงใ‚ใ‚Šใ€ใ“ใ‚Œใซ -819 ใ‚’่ถณใ™ใ“ใจใงใƒžใ‚ธใƒƒใ‚ฏใƒŠใƒณใƒใƒผ 0xcccccccd (3435973837) ใ‚’ไฝœใฃใฆใ„ใ‚‹ใ€‚

mips gcc 14.2.0

div10:
        li      $2,10                 # 0xa
        bne     $2,$0,1f
        divu    $0,$4,$2
        break   7
        mflo    $2
        jr      $31
        nop

mod10:
        li      $2,10                 # 0xa
        bne     $2,$0,1f
        divu    $0,$4,$2
        break   7
        mfhi    $2
        jr      $31
        nop

้™ค็ฎ—ๅ‘ฝไปคใ‚’็”จใ„ใฆใ„ใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚‹ใ€‚

AVR GCC 14.2.0

__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
div10:
.L__stack_usage = 0
        ldi r22,lo8(10)
        ldi r23,0
        rcall __udivmodhi4
        mov r24,r22
        mov r25,r23
        ret
mod10:
.L__stack_usage = 0
        ldi r22,lo8(10)
        ldi r23,0
        rcall __udivmodhi4
        ret

ใ“ใฎ็’ฐๅขƒใฎ unsigned int ใฏ2ใƒใ‚คใƒˆใฎใ‚ˆใ†ใงใ‚ใ‚‹ใ€‚
่‚ๅฟƒใฎๅ‡ฆ็†ๅ†…ๅฎนใฏใ€ใƒฉใ‚คใƒ–ใƒฉใƒชใซ้š ่”ฝใ•ใ‚Œใฆใ„ใ‚‹ใ€‚

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Comments

No comments

Let's comment your feelings that are more than good

0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address