lowbit 计算

lowbit(n)取出非负整数n在二进制表示下最低位的1,以及它后面的0构成的数值。

设n>0,n的第k位是1,第0~k位都是0.

为了实现 lowbit操作,先把n取反,此时第k位变成0,第0~k-1位都是1.再令 n=n+1,此时因为进位,第k位变成1,第0~k-1位都是0.

在上面的取反加1操作后,n的第k+1到最高位恰好与原来相反,所以n&(~n+1)仅有第k位为1,其余位都是0.

而在补码表示下,~n=-1-n。

所以:

lowbit(n)=n&(~n+1)=n&(-n)  .

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;


int a[1000000];
int index;
void toBinary(int n)
{
	index=0;
	while(n)
       {
		a[index++]=n%2;
		n/=2;
	}
	for(int i=index-1;i>=0;i--)
	{
		cout<<a[i];
	}
}
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<=n;i++ )
    {
		cout<<i<<":";
		toBinary(i);
		cout<<"\t"<<" "<<(-i&i)<<endl;
	}
	return 0;
}

前100位打表

100
1:1      1
2:10     2
3:11     1
4:100    4
5:101    1
6:110    2
7:111    1
8:1000   8
9:1001   1
10:1010  2
11:1011  1
12:1100  4
13:1101  1
14:1110  2
15:1111  1
16:10000         16
17:10001         1
18:10010         2
19:10011         1
20:10100         4
21:10101         1
22:10110         2
23:10111         1
24:11000         8
25:11001         1
26:11010         2
27:11011         1
28:11100         4
29:11101         1
30:11110         2
31:11111         1
32:100000        32
33:100001        1
34:100010        2
35:100011        1
36:100100        4
37:100101        1
38:100110        2
39:100111        1
40:101000        8
41:101001        1
42:101010        2
43:101011        1
44:101100        4
45:101101        1
46:101110        2
47:101111        1
48:110000        16
49:110001        1
50:110010        2
51:110011        1
52:110100        4
53:110101        1
54:110110        2
55:110111        1
56:111000        8
57:111001        1
58:111010        2
59:111011        1
60:111100        4
61:111101        1
62:111110        2
63:111111        1
64:1000000       64
65:1000001       1
66:1000010       2
67:1000011       1
68:1000100       4
69:1000101       1
70:1000110       2
71:1000111       1
72:1001000       8
73:1001001       1
74:1001010       2
75:1001011       1
76:1001100       4
77:1001101       1
78:1001110       2
79:1001111       1
80:1010000       16
81:1010001       1
82:1010010       2
83:1010011       1
84:1010100       4
85:1010101       1
86:1010110       2
87:1010111       1
88:1011000       8
89:1011001       1
90:1011010       2
91:1011011       1
92:1011100       4
93:1011101       1
94:1011110       2
95:1011111       1
96:1100000       32
97:1100001       1
98:1100010       2
99:1100011       1
100:1100100      4

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值