一、求十进制n的二进制表示中第k位数字
如: n = 15 = 1 1 1 1
第 3 2 1 0 位
步骤:(1) 先把第k位移到最后一位: n >> k;
(2) 看个位是几: x & 1;
公式
n >> k & 1
思路介绍
对于 十进制数 n >> k 即 n / 2k (向下取整)
二进制数 n >> k 即 从个位起删去k个数位其余构成新的二进制数
如: 1111 >> 2 → 11
x & 1 判断x奇偶性 → 通过个位判断,结果为0则为偶数,为1则为奇数
二、lowbit(x):返回二进制x的最后一位1
作用
例: x = 1010 lowbit(x) = 10
x = 101000 lowbit(x) = 1000
公式
x & -x
原理
C++中一个整数的负数是原数的补码(二进制表示)
补码:取反加一 -x = ~x + 1
x & -x = x & (-x + 1)
例: x = 1010···1000···0
~x = 0101···0111···1
~x+1 = 0101···1000···0
x&~x+1 = 0000···1000···0
此区域内,x为1,~x+1为0
x为0,~x+1为1
所以&运算结果为0
位与(&)
参与运算的两个数据,按照二进制位进行“与运算”。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为1,则值为1。否则为0
例如:9 & 5 = 1001 & 0101 = 0001 = 1
应用:统计二进制中1的个数
思路:每次减去x中最后一位1,直到x=0,减去次数即1的个数
1 #include <iostream> 2 using namespace std; 3 4 int lowbit(int x) 5 { 6 return x&-x; 7 } 8 9 int main() 10 { 11 int n; 12 cin >> n; 13 while(n--) 14 { 15 int x; 16 scanf("%d", &x); 17 int ans = 0; 18 while(x) 19 { 20 x -= lowbit(x); 21 ans++; 22 } 23 cout << ans << " "; 24 } 25 return 0; 26 }
三、介绍原码、反码、补码
例如: int x = 10
x二进制表示为 1010
∵int共存储32位二进制
∴ 原码 00···01010 (用0补全32位)
反码 11···10101 (~x)
补码 11···10110 (~x+1)
标签:11,运算,int,lowbit,补码,二进制 From: https://www.cnblogs.com/FISHCat-cjp/p/17234867.html