一、位的介绍
有符号数是指有正负性的,无符号数是从0开始加的。有符号数中,第一位是用来表示正负的,1为负、0为正,负数个数比正数个数多一,最经典的就是int的上下界(-2^31 到 2^31 - 1),正负数间的转换就是反码、补码:
- 负-->正:
~n + 1 - 正-->负:
~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)
例题:只出现一次的数字
浙公网安备 33010602011771号