天天看点

利用二进制解决一些问题

一 0和1 简单规则:

利用二进制解决一些问题

二、 简单题目总结:

1 已知数n,检测其K位(二进制)是否置位(是否为1)

n&(1<<k-1) 如果表达式为真,则第K位置位1。
           

说明:

1 左移 k-1位,变为 第K位为1,其他的位置为0.

根据公式a和公式c, n的二进制除k位之外,均变成0,而第k位与1 &之后,原来是什么还是什么。

如果是1,则结果一定大于0.如果是0.则最终的结果就是0.

2 给定一个操作数,将其K位置位

可以使用下面的表达式

变为1,可以使用公式d

n|1<<(k-1)
           

3 给定操作数,将第k位清零

清零应该使用公式a

n&~(1<<k-1)
           

4 切换第k位

切换一般使用 异或

n^(1<<k-1)
           

5 检查某个数是否是2的幂

给定一个数检查是否是2的n次方,可以使用表达式

if(n&n-1==0) 如果true则表示为2的n次方。

6 找到给定操作数n的模

如果是n是2的幂,则可以用下面的表达式    m&(n-1)
           

7 计算n中1的个数

方法1: 循环右移n,每个数和1进行&,结果为1,则表示为1
           
int n,count=;
 while(n){
  count+=n&;
  n=>>;
}
           
方法2 使用取模操作
           
while(n){
    if(n%==){
   count++;   
    }
n=n/;
}
           

方法3 使用切换法

while(n){
   count++;
  n=n&(n-)
}
           

8反转二进制数

对二进制数n进行反转的步骤是:

定义 int nReverse = n;

第一:nReverse左移 空出最右边的1位。

第二;取出n的最右边的一位, n&1

第三:将上面的值放到nReverse的右边。nReverse = nReverse| n&1 。

第四,将n右移,接下来循环,来处理n的第二位。

int  s= sizeof(n);
for(;n;n>>=){
    nReverse = nReverse<<;
    nReverse = nReverse|  n& 。
    s--;
}
nReverse <<=s;
           

交换二进制的奇偶位

n=01001011;

      找出操作数的奇数位   n&0xAA
      找出操作数的偶数位  n&0x55
      奇数位右移1位
      偶数未右移1位
      将两个数进行或操作。
           

继续阅读