• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
myInception
博客园    首页    新随笔    联系   管理    订阅  订阅
位运算

一、位的介绍

有符号数是指有正负性的,无符号数是从0开始加的。有符号数中,第一位是用来表示正负的,1为负、0为正,负数个数比正数个数多一,最经典的就是int的上下界(-2^31 到 2^31 - 1),正负数间的转换就是反码、补码:

  1. 负-->正:~n + 1
  2. 正-->负:~n + 1
    例如:17 <--> -17
    17的二进制为00010001(8位)
    00010001取反-->11101110,再加1-->11101111,这个即为-17;
    11101111取反-->00010000,再加1-->00010001,这个就是17;
    但是负数的最小值转换不了对应的正数,因为负数min = -2^n,而正数max = 2^n-1,比如说4位的-8(1000),它的正数也是1000。

二、位运算符

1)|:或,0010 | 1101 = 1111
2)&:与,0010 & 1101 = 0000
3)^:异或,相同的则为1,不同的则为0,0110 ^ 1101 = 0100
4)**:取反,1010 = 0101
5)
<<:左移,0110 << 1 ==> 1100
6)
>>:右移,0110 >> 1 ==> 0011,使用符号位来补位,正数补0,负数补1
7)
>>>**:右移,与>>的不同之处在于它补位用的是0
对于非负数来说,左(右)移动i位相当于乘以(除以)2^i,负数不适用!!!

三、打印二进制

怎么打印一个数的二进制呢?
以4位举例:打印12(1100)
让1左移3位(4-1),得1000,再让1000 & 1100 = 1000,不等于0,则输出1
再让1左移2位得0100,0100 & 1100 = 0100,不等于0,输出1
左移1位得0010,0010 & 1100 = 0000,等于0,输出0
左移0位得0001,0001 & 1100 = 0000,输出0
最后,总的输出即为1100,就是12的二进制数

#include <iostream>
using namespace std;

int main()
{
    int n = 32, x = 12;
    while (n--)
    {
        if (((1 << n) & x) != 0) cout << 1;
        else cout << 0;
    }
    return 0;
}

输出:0000,0000,0000,0000,0000,0000,0000,1100(12)

例题:只出现一次的数字

posted on 2026-03-09 13:09  myLv  阅读(1)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3