关键词搜索

源码搜索 ×
×

漫话Redis源码之四

发布2021-11-21浏览521次

详情内容

digits10的实现简直亮晕了双眼,居然这么巧妙,主要是基于效率的考虑:

  1. /* Modify the buffer replacing all occurrences of chars from the 'from'
  2. * set with the corresponding char in the 'to' set. Always returns s.
  3. */
  4. char *memmapchars(char *s, size_t len, const char *from, const char *to, size_t setlen) {
  5. for (size_t j = 0; j < len; j++) {
  6. for (size_t i = 0; i < setlen; i++) {
  7. if (s[j] == from[i]) {
  8. s[j] = to[i];
  9. break;
  10. }
  11. }
  12. }
  13. return s;
  14. }
  15. /* Return the number of digits of 'v' when converted to string in radix 10.
  16. * See ll2string() for more information. */
  17. uint32_t digits10(uint64_t v) {
  18. if (v < 10) return 1;
  19. if (v < 100) return 2;
  20. if (v < 1000) return 3;
  21. if (v < 1000000000000UL) {
  22. if (v < 100000000UL) {
  23. if (v < 1000000) {
  24. if (v < 10000) return 4;
  25. return 5 + (v >= 100000);
  26. }
  27. return 7 + (v >= 10000000UL);
  28. }
  29. if (v < 10000000000UL) {
  30. return 9 + (v >= 1000000000UL);
  31. }
  32. return 11 + (v >= 100000000000UL);
  33. }
  34. return 12 + digits10(v / 1000000000000UL);
  35. }
  36. /* Like digits10() but for signed values. */
  37. uint32_t sdigits10(int64_t v) {
  38. if (v < 0) {
  39. /* Abs value of LLONG_MIN requires special handling. */
  40. uint64_t uv = (v != LLONG_MIN) ?
  41. (uint64_t)-v : ((uint64_t) LLONG_MAX)+1;
  42. return digits10(uv)+1; /* +1 for the minus. */
  43. } else {
  44. return digits10(v);
  45. }
  46. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载