按位或(|)
按位或运算符 | 对两个数的每一位进行比较,如果两个数中至少有一个为 1,则结果位为 1;否则,结果位为0。
1010 (10 in decimal)
| 1100 (12 in decimal)
------
1110 (14 in decimal)
力扣相关题目——传送门
public class Solution {
public string ToLowerCase(string s) {
StringBuilder sb = new StringBuilder();
foreach(char c in s){
char cNew = (int) c >= 65 && (int) c <= 90 ? (char) (c|32) : (char) c ;
sb.Append(cNew);
}
return sb.ToString();
}
}
/*
大写字母 A - Z 的 ASCII 码范围为 [65,90]:
小写字母 a - z 的 ASCII 码范围为 [97,122]。
*/
例如,大写字母 A 的 ASCII 码值 65 的二进制表示是
,与 32 的二进制表示
进行或操作后得到
,这是小写字母 a 的 ASCII 码值 97 的二进制表示。
顺便扩充下知识——明明只有26个字母,为什么大小字母之间是差32而不是26?
按位与(&)
按位与运算符 & 对两个数的每一位进行比较,只有当两个数的对应位都为 1 时,结果位才为 1;否则,结果位为0。
1010 (10 in decimal)
& 1100 (12 in decimal)
------
1000 (8 in decimal)
力扣相关题目——传送门
public class Solution {
public bool IsPowerOfTwo(int n) {
// 按位与
if (n <= 0){
return false;
}
return (n & (n - 1)) == 0;
}
}
如果 n 是 2 的幂次方,当且仅当 n 是正整数,则 n 的二进制表示中仅包含 1 个 1。
因此我们可以考虑使用位运算,将 n 的二进制表示中最低位的那个 1 提取出来,再判断剩余的数值是否为 0 即可。n 与 n - 1进行按位与操作(&)的结果为0,这是因为 n - 1 的二进制表示是 n 的二进制表示中从最低位的1开始到最低位的所有位都翻转。例如,和
进行按位与操作的结果是
,则可以判断 8 是 2 的幂次方,因为剩余的数值为 0 ;又如,
和
进行按位与操作的结果是
,则可以判断 9 不是 2 的幂次方,因为剩余的数值不为 0 。