c语言0x34字节怎么取反,关于JAVA入门二进制课程的笔记

由于JAVA二进制基础那节课程讲解实在低于应该有的教学水平,故在此写下笔记。

*虽然是免费课程,但是我不认为这是一个该有的【教学】课程,我是一个很认真的人,所以我决定自己做笔记,自己找资料进行学习,这位老师也许是一个实战很强的人,但是人各有所长也各有所短,勿喷。

—————————————————————————————————

二进制基础

进制转换

-1(十进制)=0000 0001        -2(十进制)=0000 0010(1+1进一位)

-1字节(Byte)有8个二进制位(8bit),以后的笔记某些地方会省略前面的0000

-8(十进制)= 1000(二进制)、10(十进制)=1010(二进制)

-自己动手丰衣足食:自己写下1-10的二进制位加强记忆吧

1110100101(二进制)怎么算呢?

发现规律:2是10、4是100、8是1000、16是10000、32是100000、64是1000000、128是10000000

解:题中数字有10位

∵最高位是1(9个0)+1(8个0)+1(7个0)+0+1(5个0)+0+0+1(2个0)+1

∵1000000000+100000000+10000000+0(第6位没有)+100000+0+0(第4,3位没有)+100+1

∴把上面的数转化为十进制:512+256+128+32+4+1=933

1234(十进制)怎么算呢?

按照上一个问题的2最大幂次方的数字相加的方式,把题目数字加满为止

1234=1024+128+64+16+2 = 10011010010(1024有10个0,128有7个0,所以最前位是1001)

-自己动手丰衣足食:自己想一个二进制和一个十进制,分别把他们转化一下吧

与运算&

(对比的)两位都是1,结果才为1

0&0=0; 0&1=0; 1&0=0; 1&1=1;

例如:51&5 即转化为二进制进行对比↓0011 0011 &

0000 0101 =

0000 0001 ;

因此:51&5=1

*特殊用法:

1)清零:将一个单元清零,只需跟个位为0的数值相“与”

2)取一个数的指定位,只需1相“与”即可获得

例:设X=10101110,取X的低4位(最后4位),用X & 0000 1111 = 0000 1110即可得到低4位。排除不需要的位数,与1进行“与运算”即可得到正确的值。

或运算  |

只要有一个为1,结果为1

0|0=0; 0|1=1; 1|0=1; 1|1=1;

例如:51&50011 0011 |

0000 0101 =

0011 0111 ;

因此51|5=55

*特殊用法:

1)把一个数值指定位变1,与1“相或”

例:将X=1010 0000的低4位为1,用X | 0000 1111 = 1010 1111即可得到。

异或运算 ^

两个对应位为“异”(不同),结果为1,相同为0

0^0=0; 0^1=1; 1^0=1; 1^1=0;

例如:51^50011 0011 ^

0000 0101 =

0011 0110 ;

因此51^5=54

*特殊用法:

1)使特定位数翻转,与1“异或”

例:X=1010 1111,使X低4位翻转,X^0000 1111=1010 0001即可得到。

2)保留原值,与0“异或”

例:X=1010 1111,使X保留原值,X^0000 0000 = 1010 1110即可得到。

3)两数交换a=01,b=10,a^b=11,c=11(出现规律)

01^10=11;

11^01=10;

11^10=01;

即a^b=c;

c^a=b;

c^b=a;

将两数异或的结果与其中一个数再进行异或,可以得到另一个数。

尝试一下将:12^34异或之后,再用得到的值与12或34再进行异或吧。

取反运算  ~

一个二进制数按位取反,将0变1,1变0

~1=0; ~0=1;

左移运算<<

将一个运算对象的每个二进制位全部左移X(指定)位(最左位丢弃,右边补0)2<<1=4 等值于 0000 0010 <

11<<2=44 →等值于→ (1011)<2=(0010 1100);

11 = (0000 0000 0000 0000 0000 0000 0000 1011) 为32bit

-1 = (1111 1111 1111 1111 1111 1111 1111 1111) 为32bit-14 = (1111 0011) <

解:采用 [取反补1]

∵-14取绝对值|14|,原码为0000 1110,反码为1111 0001,补码+1为1111 0010

∴-14<<2 = 1111 0010<<2 = 1100 1000;

*不用担心,下面马上就会详细讲解上面的意思,并有测验帮助理解

*每左移一位相当于×2。0100(4)左移1位=1000(8)

右移运算  >>

将一个运算对象的每个二进制位全部右移X位(正数左补0,负数左补1,右边丢弃)

例1:9>>2 =

*每右移一位相当于÷2。1000(8)=右移1位=0100(4)

无符号右移运算 >>>

整体向右移动指定位数,(左边空位用0填充,右边丢弃)-14 >>> 2 = 1073741820

(11111111111111111111111111110010) >>> 2 =

(00111111111111111111111111111100) = 1073741820

—————————————————————————————————

原码:一个整数的绝对值大小转换为二进制称为原码

反码:将二进制数按位取反,所得的新二进制数与原二进制数互为反码

补码:反码+1称为补码

如何获得负数(十进制)的二进制数?先取负数的绝对值,然后取反码+1

如何获得负数(二进制)的十进制数?补码-1得到反码,反码取反得到原码

-自己动手丰衣足食:-99<<2的二进制是多少?

-自己动手丰衣足食:-1101011的十进制是多少?

JAVA内置进制转换十进制   转换成 十六进制integer.toHexString(int i)

十进制   转换成 八进制integer.toOctalString(int i)

十进制   转换成 二进制integer.toBinaryString(int i)

十六进制 转换成 十进制integer.valueOf(“FFFF”,16).toString()

八进制   转换成 十进制integer.valueOf(“376”,8).toString()

二进制   转换成 十进制integer.valueOf(“0101”,2).toString()

*int i 写转换的数字

*FFFF和376和0101必须严格按照进制的数值来填写,否则会报错

JAVA中的数据类型

JAVA语言应用于高层,C语言应用于底层,进制转换在跨平台中和网络程序中运用的较多,如:文件读写,数据通信。

int数据类型有:byte(8bit,-128~127)、short(16bit)、int(32bit)、long(64bit)

float数据类型有:单精度(32bit float)、双精度(64bit double)

boolean类型变量的取值有:true、false(1bit)

char数据类型有:unicode字符(16bit)

对应的[类]类型

Integer、Float、Boolean、Character、Double、Short、Byte、Long

JAVA数据类型 转化为 字节

如何在内存中对这些字节进行排序:大端法(Big-endian)和小端法(Little-endian)

·       先取高字节的数据存放在低地址,低字节存放在高地址,则是大端法

·       先取低字节的数据存放在低地址,高字节存放在高地址,则是小端法

*不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址。

*大端法或小端法是数据在存储时的表现,而不是在寄存器中参与运算时的表现。

例如0x0A0B0C0CD的在大端和小端中的存放方式分别为:

63b51a582793041907096ed2991e9d3e.png

8fd08d1a055b72c5e17324ae362c8006.png

______________________________________________________________

栈底 (高地址)

---------------

buf[3] (0x78) -- 低位

buf[2] (0x56)

buf[1] (0x34)

buf[0] (0x12) -- 高位

---------------

栈顶 (低地址)

问答1:按照【?】方式存放在内存中呢?

______________________________________________________________

栈底 (高地址)

---------------

buf[3] (0x12) -- 高位

buf[2] (0x34)

buf[1] (0x56)

buf[0] (0x78) -- 低位

---------------

栈顶 (低地址)

问答2:按照【?】方法存放在内存中呢?

______________________________________________________________

最后关于数据转化的代码:

package com.radix.byteoperator;public class Convert {

/*

* int转化为byte[]

*/

public static byte[] int2Bytes(int id){

//int为32位 4字节,创建length为4的byte数组

byte[] arr = new byte[4];

arr[0] = (byte)((int)(id>>0*8) & 0xff);

arr[1] = (byte)((int)(id>>1*8) & 0xff);

arr[2] = (byte)((int)(id>>2*8) & 0xff);

arr[3] = (byte)((int)(id>>3*8) & 0xff);

return arr;

}

/*

* byte[]转化为int

*/

public static int byte2int(byte[] arr){

int i0 = (int)((arr[0] & 0xff)<<0*8);

int i1 = (int)((arr[1] & 0xff)<<1*8);

int i2 = (int)((arr[2] & 0xff)<<2*8);

int i3 = (int)((arr[3] & 0xff)<<3*8);

return i0+i1+i2+i3;

}

public static void main(String[] args){

byte[] int2byte = Convert.int2Bytes(8143);

for(byte b:int2byte){

System.out.println("---->"+b);

}

int byte2int = Convert.byte2int(int2byte);

System.out.println("

}

}

打开App,阅读手记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值