二进制数操作

来源:互联网 发布:mac idea groovy 配置 编辑:程序博客网 时间:2024/05/16 01:30

所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

以-2为例,原码为10010, 反码11101 (10010,1为符号码,故为负)

(11101) 二进制,-13 十进制[当然,以上这些没有考虑系统位数]

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

 

还有一条规则:原码+补码=1后面跟若干个0

 

求负数的二进制:对负数绝对值的二进制码先求反码,然后求补码。

反码:是0跟1的反转。

补码:反码+1,建立在反码的基础上,运算规则是逢2进1.

举个例子:-8的反码,对8求二进制,整数占4个字节,每个字节8个比特。

10001000           原码

11110111           反码

11111000           补码

二进制需要被指定为有符号整数和无符号整数两种。

有符号整数:最高位表示符号位,1表示负数,0表示正数。负数需要先-1,然后求反码。

举个例子:

11111111           无符号              255

10000000           有符号              -128

10000001           有符号              -127

计算有符号的时候,可以直接对其(-1)x高位(7)-其他位;也可以先对其-1,然后求反,以无符号数计算。-

 

16进制和2进制的转换

每一位16进制位转换为对应的4byte的组合就是对应的二进制编码。同理,二进制转16进制也一样。举个例子:

-8                16进制

1000           二进制              8

10001000           -8               二进制原码              对应的1个字节

 

负数跟正数的&运算是通过使用正数的二进制码与负数的补码按位与计算的。

 

位运算

从bool的角度来看:

| 在二进制位只要有1的情况下得到1;

& 必须都是1的情况下得到1;

^ 两者相异的情况下得到1;


int number(int n){//存在安全隐患int count=0;while(n){if(n&1)count++;n=n>>1;}return count;}


原创粉丝点击