使用按位运算符来加/减2的倍数

时间:2014-10-16 22:59:46

标签: language-agnostic bit-manipulation bitwise-operators computer-architecture

我注意到小写和大写之间的区别是32。这似乎是利用一些巧妙的位操作的绝佳机会。问题是我的计算机架构课程已经很长时间了,而且我对所需的概念有点生疏。根据我的记忆,取决于CPU架构和签名/未签名的语言表示,只有极少数的解决方案适用于几乎所有这些运算符的编程语言。我有兴趣比较这些。我对简单转换案件不感兴趣,我知道有更简单的"方式(至少对人类而言)。我有兴趣了解这个问题如何与数据的低级别表示进行交互。

请为每个常见的表示提供小写 - >大写 - >大写 - >大写 - 低级的可行的最小解决方案,以及对它们如何工作的相当详细的解释。

1 个答案:

答案 0 :(得分:1)

(注意:我在这里使用python,但这当然是语言无关的。我也谈到ascii,所以我将使用7位表示事情。)

如果您查看ascii范围内[a-z][A-Z]字符的二进制表示,您会注意到两件事:

>>> bin(ord('a'))
'0b1100001'
>>> bin(ord('A'))
'0b1000001'
>>> bin(ord('y'))
'0b1111001'
>>> bin(ord('Y'))
'0b1011001'

首先:他们都设置了第七位(右起)。 第二:小写字符有第六位(从右边)设置,大写字母未设置,这是给定大写字符和它的小写版本之间的唯一区别(反之亦然)。

所以你要做的就是将这一点翻转到切换案例 - xor 0b0100000xor 0x20

lower(),您必须设置该位,以便or 0b0100000 or 0x20 - 已提及的or 0x60也可以,因为0x60是0b1100000而且无论如何都设置了位。

对于鞋面,你必须取消设置该位,即"以及掩码的倒数0b0100000",这与and 0x5f相同。

为了看到这一切,我写了一些python snipplet,它们检查我们刚看到的对于英文字母中的每个字符都是真的:

#toggle():
>>> ''.join(chr(ord(c)^0x20) for c in string.ascii_lowercase) == string.ascii_uppercase
True
>>> ''.join(chr(ord(c)^0x20) for c in string.ascii_uppercase) == string.ascii_lowercase
True

#lower():
>>> ''.join(chr(ord(c)|0x20) for c in string.ascii_lowercase) == string.ascii_lowercase
True
>>> ''.join(chr(ord(c)|0x20) for c in string.ascii_uppercase) == string.ascii_lowercase

#upper():
>>> ''.join(chr(ord(c)&0x5f) for c in string.ascii_lowercase) == string.ascii_uppercase
True
>>> ''.join(chr(ord(c)&0x5f) for c in string.ascii_uppercase) == string.ascii_uppercase
True

它对' ''\n'没有任何用处,尽管如此!