进制详解

位数:从右到左为由低到高。最高位就是最左边的第一位

1.二进制的最高位是符号位:0正数,1负数

2.正数的原码,补码,反码都一样

3.负数的反码=它原码符号位不变,其他位取反(0->1,1->0)。注意反码和取反(~)运算的区别,反码符号位不变,其他取反。而取反运算包括符号位都要取反

4.负数的补码=它的反码+1 

5.0的反码,补码都是0

6.java没有无符号数,java的数都是有符号的

7.计算机运算的时候,都是以补码的方式运算

如:int a=1;最低位表示2^0,就是最后一位:2^(1-1) ,倒数第二位:2^(2-1),倒数第三位:2^(3-1)

00000000 00000000 00000000 00000001 –>表示1*2^0

00000000 00000000 00000000 00000011->表示1+1*2^1  

00000000 00000000 00000000 00000111->表示1+ 1*2^1  +1*2^2

 

求:1+1=?,因为两个都是正数,所以计算的时候虽然是以补码的方式,但正数的补码和原码一样

00000000 00000000 00000000 00000001

+00000000 00000000 00000000 00000001

       00000000 00000000 00000000 00000010(逢二进一,上下1+1=2

 =0*2^0+1*2^1=2

求:1-2=?,实际就是求1+-2),1的补码就是原码,-2的补码是它的反码+1,而它的反码是符号位不变,其他取反

1的原码:00000000 00000000 00000000 00000001 

1的补码:00000000 00000000 00000000 00000001 

-2的原码:   10000000 00000000 00000000 00000010

-2的反码:  11111111 11111111 11111111 11111101

-2的补码=反码+1                  

11111111 11111111 11111111 11111101

+00000000 00000000 00000000 00000001

=11111111 11111111 11111111 11111110       

 

1+-2=

1的补码+-2)的补码:

00000000 00000000 00000000 00000001

+ 11111111 11111111 11111111 11111110

=11111111 11111111 11111111 11111111 (因为符号位(最高位)是1,所以表示负数,所以运算的结果是为补码,所以要将补码转成原码:反码=补码-1,然后将反码的符号位不变,其他位取反)

  11111111 11111111 11111111 11111111

-         00000000 00000000 00000000 00000001

=  11111111 11111111 11111111 11111110(反码)->进行取反

   10000000 00000000 00000000 00000001 (原码)

= -1

位运算符(~|&^

求:~2=?(取反,0->1,1->0,符号位一样要去反)注意反码和取反的区别,反码符号位不变,其他取反

2的原码:                     00000000 00000000 00000000 00000010

取反:          11111111 11111111 11111111 11111101 (符号位是1,所以是负数,得到的那就是补码)

反码=补码-1   -00000000 00000000 00000000 00000001

                      =  11111111 11111111 11111111 1111100

原码=反码取反:  10000000 00000000 00000000 00000011

               =-1+1*2^1

                                =-3

求:~-5=?(取反,0->1,1->0,符号位一样要去反),对负数取反,就是对负数的补码进行取反

-5的原码:10000000 00000000 00000000 00000101

-5的反码:11111111 11111111 11111111 11111010      (反码=符号位不变,其他取反)

                +   00000000 00000000 00000000 00000001    

-5的补码:11111111 11111111 11111111 11111011

-5的补码进行取反

00000000 00000000 00000000 00000100(符号位为正数,补码和原码一样)

=4

求:2&3=?按位与(两位全为1,则为1

200000000 00000000 00000000 00000010

300000000 00000000 00000000 00000011

=  00000000 00000000 00000000 00000010

=2

求:2|3=?按位或(有一个1,则为1

=  0000000 00000000 00000000 00000011

=3

 

:-3^3=?(异或,两个不同才为1

-3的原码:10000000 00000000 00000000 00000011

-3的反码:11111111 11111111 11111111 11111100

-3的补码:11111111 11111111 11111111 11111101

3的补码: 00000000 00000000 00000000 00000011

异或:     11111111 11111111 11111111 11111110(最高位为1,是负数,得到的是补码,将他转成原码)

反码:     11111111 11111111 11111111 11111110

           00000000 00000000 00000000 00000001

                            =11111111 11111111 11111111 11111101(减时:将11111110退一位(不就是变成2吗)类似11111102

然后11111102-00000001=11111101

原码:    10000000 00000000 00000000 00000010(反码取反。符号位不变)

                     =-2

移位运算(<<,>>>,>>)在内存中运算,非常快

移位运算都是以补码的形式运算

求:1>>2(低位溢出,符号位不变,并用符号位补溢出的最高位):2表示两位

1的补码:

0000000 00000000 00000000 00000001 然后向右移2位,则1跑出了32位中,其他的用0补齐

0(00)00000 00000000 00000000 00000000 0101跑出去了,左边的向右移2位,符号位不变,并用符号位补最高位(因为0为符号位,所以用0去补)所以结果为0

 

求:-1>>2

-1的补码:11111111 11111111 11111111 11111111 向右移2位,符号位不变,其他的用符号位补齐

                        1(11)1111 11111111 11111111 11111111 1111被溢出来了,然后用符号位补齐。因为符号位为1,所以用1去补齐。因为符号位为1,所以为负数,得到的是补码,所以将补码得到原码

补码:11111111 11111111 1111111 11111111

反码:11111111 11111111 1111111 11111110

原码:10000000 00000000 00000000 00000001

=-1

求:1<<2 (符号位不变,低位补0,移动一位相当于乘以2^1,移动2位相当于乘以2^2

所以1*2^2=4

:2<<2 = 2*2^2=8

  求:-1<<2 ->-1*2^2=-4

  : 2<<4-> 2*2^4=32

  求:1<<1  -> 1*2^1=2

 

 

 求:3>>>2 (低位溢出,高位补0

3的补码:00000000 00000000 00000000 00000011

向右移2为:0(00)00000 0000000000 00000000 00000000 11

      =0

F表示一个16进制,因为一个字节一个8位,所以一个字节等于2个16位。

向右移24为,就是将01111111 11111111 11111111 11111111变为00000000 00000000 00000000 01111111

将第一位(最高位)的第一个0移动到最后一位(最低位)的第一个0。从左到右:位数由高到低

想要把一个int值存入流中,就要像上面一样存,先i>>>24I,因为int1个字节,write只能一个一个字节的存,所以先把最低位的1个字节存进去后,再存高位的

时间: 2024-07-29 13:12:03

进制详解的相关文章

Java I/O : Java中的进制详解

作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层.那么二进制,字节码这些会在哪里用到呢? 自问自答:在跨平台的时候,就凸显神功了.比如说文件读写,数据通信,还有Java编译后的字节码文件.下面会有个数据通信的例子哦. Java对对象实现Serializablle接口,就可以将其转化为一系列字节,而在通信中,不必要关系数据如何在不同机器表示和字节的顺

浅谈IP地址和子网掩码的对应关系,以及2进制和10进制详解!

大家好,我是带你们成长的凡凡- IP地址的结构:     #长度为 32 bit:先    #结构 - 网络位 + 主机位 子网掩码:      -作用           区分IP地址中的网络位与主机位          必须与IP地址,一一对应,成对出现:  -表示         纯2进制          点分十进制 (y.y.y.y) ->y的取值范围是 0 --255         /n (n表示的是子网掩码中有多少个1)      -功能实现         子网掩码中1所对应的

结构体位制详解 -- C

我基本总结下面4部分: 1.占位大小问题. 2.字节对齐问题. 3.特殊保留位0. 4.该结构体在内存中存放位置. #include <stdio.h> #include <stdlib.h> #include <string.h> //基本概念 /* struct _M { (1) 类型 参数名 : 占位大小: (2) 类型 : 占位大小: } (1) 类型 -- int,unsigned(32位),short,char. 参数名 -- 同个结构体里面不能重名参数.

数学推导+高精度进制转换+解同余方程 POJ 3708

题意:点击打开链接 把m,k表示成d进制,对于这个递归函数,每一次递归都是一次每一位数字的置换,求出每一位的循环节,最终f(m)=k就是要每一位都相等,即解同余方程组. 代码: #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include<climits> #include <algorith

13 * 16 = 244 解这些数是什么进制数 -- C

/* 13 * 16 = 244 设为x进制数 解: (1*x + 3) * (1*x + 3) = 2*x^2 + 4*x +4 x^2 + 9x + 18 = 2x^2 + 4x + 4 x^2 - 5x - 14 = 0 (x - 7)(x - 2) = 0 解得: x = 7 或者 x = 2 接下来不用说了.. */ 13 * 16 = 244 解这些数是什么进制数 -- C

详解2进制,10进制,16进制,8进制,36进制

本篇介绍C/C++语言中的进制的概念,主要介绍2进制.10进制.16进制,这三种是编程时必须掌握的也是最经常使用的.另外,介绍8进制和36进制,当中 36进制在实际project项目中会遇到. (本文选自<C/C++学习指南>.邵发.附录"2进制,10进制,16进制") 讲2进制.10进制.16进制的视频教程,点击观看 权利声明:作者拥有本书的所有权利. 作者授权不论什么人都能够自由转载本站点公布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载.不得有不论什么改动,

【详解】C语言:编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。

#include<stdio.h> void itob(int n,char s[], int b) {  int i=1;  for(;i<=32;i++)    //共循环了32次,保证得到32位的二进制数  {   s[i-1]= n % b;   //数组是从编号0开始的,一直到编号31结束   n = n/b ; //用模除的方法依次得到每位进制数  }  for(i=32;i>0;i--)  {   printf("%d",s[i-1]);   }

js中的变量提升,运算符详解及计算机的进制

变量提升 凡是存到存储空间的变量(用var声明的变量)都有提升的功能.再没有赋值之前就可以使用这个变量,只不过值是undefined.. 运算符 =  赋值运算  var a=5: 把数字5赋值给变量a == 双等号  等于判断  返回的是true和false 主要用于判断 + 加法运算 -减法运算 * 乘法运算 /除法运算 % 取模(求余) ++ 自增每次加一 A++ 先使用变量a用完之后再加1 ++a 先让a加1然后再使用变量a -- A--  先使用变量a再自减1 --a  先自减1 再使

将n进制的数组压缩成字符串(0-9 a-z)同时解压

此类题目要明确两点: 1. 打表:用数组下标索引字符,同时注意如果从字符对应回数字: int index = (str[i] >= '0' && str[i] <= '9') ? (str[i]-'0'-radix):(str[i]-'a'-radix + 10); 2. 注意低位在前还是高位在前,如果先来的是 低位*radix^i 即可. 3. 统计每几个radix进制数组成一位,利用bits来表示... 这破题主要是麻烦... #include <assert.h&g