原码、反码、补码以及lowbit运算

原码、反码、补码以及lowbit运算

原码:

可以用来计算正数加减,正数的原码、反码、补码都一样。

第一位为符号位,符号位0为正数,1为负数(32位字符,这里用4位来举例子,后面皆是用4位来举例子,其中第一位是符号位)。

cpp 复制代码
1 1 1 1(-7)
1 1 1 0(-6)
1 1 0 1(-5)
1 1 0 0(-4)
1 0 1 1(-3)
1 0 1 0(-2)
1 0 0 1(-1)
1 0 0 0(-0)
0 0 0 0(0)
0 0 0 1(1)
0 0 1 0(2)
0 0 1 1(3)
0 1 0 0(4)
0 1 0 1(5)
0 1 1 0(6)
0 1 1 1(7)

反码:

反码的来源:

由于原码中正数(1)与负数(-1)计算错误,引入反码(ones complement),负数的反码=原码按位取反。

cpp 复制代码
1 0 0 0(-7)
1 0 0 1(-6)
1 0 1 0(-5)
1 0 1 1(-4)
1 1 0 0(-3)
1 1 0 1(-2)
1 1 1 0(-1)
1 1 1 1(-0)
0 0 0 0(0)
0 0 0 1(1)
0 0 1 0(2)
0 0 1 1(3)
0 1 0 0(4)
0 1 0 1(5)
0 1 1 0(6)
0 1 1 1(7)

补码:

补码的来源:

由于原码中正数(5)与负数(-3)计算错误,答案都有正确答案差一,引入补码(two's complement),负数的二进制表示=补码=反码➕1,

计算机里都是通过补码来存储信息的。

cpp 复制代码
1 0 0 0(-8)
1 0 0 1(-7)
1 0 1 0(-6)
1 0 1 1(-5)
1 1 0 0(-4)
1 1 0 1(-3)
1 1 1 0(-2)
1 1 1 1(-1)
0 0 0 0(0)
0 0 0 1(1)
0 0 1 0(2)
0 0 1 1(3)
0 1 0 0(4)
0 1 0 1(5)
0 1 1 0(6)
0 1 1 1(7)

lowbit运算:

cpp 复制代码
int lowbit(int x){
      return x&(-x);
}

lowbit运算的返回值:

lowbit运算返回x二进制中最低位的1和后面的0所组成的十进制数。

lowbit运算处理的问题:

如何求一个数二进制表示含1的个数?

1、没有使用lowbit优化,会一直向前移动。

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
    int n,cnt;
    cin>>n;
    while(n){
        if(n&1==1){
            cnt++;
        }
        n=n>>1;
    }
    cout<<cnt;
    return 0;
}

2、使用lowbit优化,每次减去上一个数的lowbit会抹去上个的最后一位一会加快运行速度,不会一直向前移动就可以统计出一个数二进制中含一的个数。

cpp 复制代码
#include<iostream>
using namespace std;
int lowbit(int x){
    return x & -x;
}
int n;
int main(){
    cin>>n;
    while(n){
        int x;
        cin>>x;
        int res=0;
        while(x){
            x-=lowbit(x);
            res++;
        }
        n--;
        cout<<res;
    }
    return 0;
}
相关推荐
雨中飘荡的记忆几秒前
Java面向对象编程详解
java·开发语言
添砖java‘’2 分钟前
Linux信号机制详解:从产生到处理
linux·c++·操作系统·信号处理
月明长歌5 分钟前
【码道初阶】【LeetCode 958】判定完全二叉树:警惕 BFS 中的“管中窥豹”陷阱
算法·leetcode·宽度优先
MC皮蛋侠客27 分钟前
Linux C++使用GDB调试动态库崩溃问题完全指南
linux·c++
超轶绝尘38 分钟前
C++学习笔记 23 宏 Macro
c++
222you1 小时前
线程的常用方法
java·开发语言
一直都在5721 小时前
数据结构入门:二叉排序树的构建与相关算法
数据结构·算法
云栖梦泽1 小时前
易语言界面美化与组件扩展
开发语言
catchadmin1 小时前
PHP 值对象实战指南:避免原始类型偏执
android·开发语言·php
_Minato_1 小时前
数据结构知识整理——复杂度的计算
数据结构·经验分享·笔记·算法·软考