java - 如何在不使用任何内置方法或函数的情况下在恒定时间 (O(1)) 内获取字母表 (1-26) 中字符的数值/位置?

标签 java c++ c algorithm

如何在恒定时间 (O(1)) 内获取字母表 (1-26) 中字符的数值/位置,而不使用任何内置方法或函数,也不关心字符的大小写?

最佳答案

如果您的编译器支持二进制文字,您可以使用

int value = 0b00011111 & character;

如果没有,您可以使用 31 代替 0b00011111,因为它们是等效的。

int value = 31 & character;

或者如果您想使用十六进制

int value = 0x1F & character;

或八进制

int value = 037 & character;

您可以使用任何方式来表示值 31。

这是有效的,因为在 ASCII 中,小写值以 011 为前缀,大写值以 010 为前缀,然后是 1-26 的二进制等价物。 通过使用位掩码 00011111 和 AND 操作数,我们将 3 个最高有效位转换为零。这样我们就得到了 00001 到 11010、1 到 26。

关于java - 如何在不使用任何内置方法或函数的情况下在恒定时间 (O(1)) 内获取字母表 (1-26) 中字符的数值/位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31284070/

相关文章:

c - 如果否则逻辑 |金字塔误差

代码审查 : finding </body> tag reverse search on a non-null terminated char str

java - JVMJ9VM035 无法分配 OutOfMemoryError

c++ - unordered_set::remove_if(): C3892: 无法分配给常量变量

java - 如何将 'spring boot 2.1 with elasticsearch 6.6' 与集群节点 'https' 连接?

C++ DevIL 函数 ilLoadImage - 程序退出,访问冲突

c++ - 如何声明指向另一个数组元素的指针数组

c - int 指针指向两个结构体指针?

java - Spring LDAP 安全性不断重置

java - 使用反射覆盖 2 + 2 = 5