如何对整数或字节的所有位取反,使用XOR运算符实现位翻转
错误原因
- 移位操作逻辑错误:C#中对
int类型做移位运算时,移位长度只会取右操作数的低5位(即对32取模),你定义的key=255,实际有效移位长度是255 % 32 = 31,x[0] << 31和原值异或的操作完全不符合逐位翻转的需求。 - 运算符选择错误:你后续尝试的按位或
|、按位与&本身没有位翻转的能力,只有按位异或^可以实现「和1异或则翻转、和0异或则保留」的效果。
正确实现逻辑
逐位翻转整数/字符的位,核心是和对应位数的全1掩码做异或运算,不需要移位操作:
- 若要翻转
char(C#中为16位UTF-16字符)的全部位,掩码用0xFFFF - 若要翻转
int(32位有符号整数)的全部位,掩码用0xFFFFFFFF
代码示例
public string text = "password"; // 翻转单个字符的位示例 char originalChar = text[0]; // 和16位全1掩码异或,实现逐位翻转 char flippedChar = (char)(originalChar ^ 0xFFFF); // 如果要翻转整个字符串的所有字符 char[] flippedChars = text.Select(c => (char)(c ^ 0xFFFF)).ToArray(); string flippedText = new string(flippedChars); // 如果是要翻转int类型的32位全部位 int originalInt = 12345; int flippedInt = originalInt ^ unchecked((int)0xFFFFFFFF);
内容的提问来源于stack exchange,提问作者MilitaryG
相关产品推荐
相关产品推荐

