有关移位的问题,觉得有点难度,请大家帮忙出出主意,100分相送。。。 对于C语言和Java语言写的这两段程序,哪一个结果符合题目要求?还是都不符合?请大侠们赐教!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 按照题目要求:b1 : 1000 0000b2 : 1000 1111将b1和b2看出无符号数,按byte1 << 8 | byte2运算得result:1000 0000 1000 1111将result看成带符号数,转换成10进制表示是不是-81呢?如果将一个数看作带符号数,则其最高位是符号位。计算这个数的绝对值时,符号位参不参与运算? 刚刚测试一下,发现个新问题,假设有:b3 = 0x7f, 即:0111 1111b4 = 0x80, 即: 1000 0000将b3和b4看成无符号数,按byte1 << 8 | byte2运算得result:0111 1111 1000 0000将result看成带符号数,转换成10进制表示应该是32640吧?可是这段代码得到的运算结果是-128: byte b3 = 0x7f; byte b4 = (byte)0x80; int result = (b3 << 8) | b4; System.out.println(String.format("%d", (short)result));这是怎么回事呢? 问题是这样:java 中 byte 是有符号的,| 的时候,两边自动扩展成 intb1 << 8 | b2b1 << 8 = 0.. 0111 1111 0000 0000b2 作为 byte 是 1000 0000,扩展成 int 就不得了了, 1.. 1111 1111 1000 0000 然后 b1 << 8 再 | b2, b2 前面都是1,最终结果当然还是 1.. 1111 1111 1000 0000就是 -128,正确的做法是: int result = ((b1 << 8) & 0xFFFF) | (b2 & 0xFF);结果就正确了 结果真的正确,谢谢 crow_soup() 。但俺还是不知道为什么 ((b1 << 8) & 0xFFFF) | (b2 & 0xFF)这样就行呢说说道理吧?如果题目要求稍为改一下,把b1和b2还是看作无符号数,其运算方式要求改为:(b1 <<24) | (b2 <<16),那么实际写java程序时,这一句该写成什么?是不是:((b1 <<24) & 0xffffffff | (b2 <<16) & 0xffffff这样写对不对? 自己琢磨了一下,b2 & 0xFF 的用意是将最高位转为0(如果原来最高位是1的话),这样会不会改变原来b2的值吗?为什么还会得到正确的结果呢? 噢,好像上面自己琢磨错了。b2 & 0xFF 运算之前,会将b2扩展成int形式: 1111 1111 1111 1111 1111 1111 1000 0000而0xff的是:0000 0000 0000 0000 1111 1111 1111 1111两者相&之后,将b2的第0个字节和第1个字节全部改为0了。 咦,0xff 应该是 0000 0000 0000 0000 0000 0000 1111 1111 吧,我为什么在版面上看不到这篇文章了呢? 对于无符号数,你用short或char型存储就行了判断byte小于0,+256就是 发现一个新问题:以下代码的运算结果是-128,但本人认为是4294967168才对呀??? int b1 = 0xff; int b2 = 0xff; int b3 = 0xff; int b4 = 0x80; int result = (b1 << 24) | (b2 << 16 ) | (b3 << 8) | b4; System.out.println(String.format("%d", result)); :S32位的带符号的int FFFFFF80 不就是 -128 吗? java中的继承 不知道怎么用java解析XML.新人求帮助。 (在线等)如何写一个自己的source reader来读自己的数据 一个关于JFrame和JPanel的问题 簡單問題 还是Hashtable 问题. 非常急的难题,请帮忙。 一些关于手机编程的基本问题? 有哪位给我讲讲为什么java要这样? wls 7中关于word的问题 怎样用JAVA操作注册表? j2sdk-doc 的阅读问题?(来者给分)
b1 : 1000 0000
b2 : 1000 1111
将b1和b2看出无符号数,按byte1 << 8 | byte2运算得
result:1000 0000 1000 1111
将result看成带符号数,转换成10进制表示是不是-81呢?如果将一个数看作带符号数,则其最高位是符号位。计算这个数的绝对值时,符号位参不参与运算?
b3 = 0x7f, 即:0111 1111
b4 = 0x80, 即: 1000 0000
将b3和b4看成无符号数,按byte1 << 8 | byte2运算得
result:0111 1111 1000 0000
将result看成带符号数,转换成10进制表示应该是32640吧?可是这段代码得到的运算结果是-128:
byte b3 = 0x7f;
byte b4 = (byte)0x80;
int result = (b3 << 8) | b4;
System.out.println(String.format("%d", (short)result));这是怎么回事呢?
java 中 byte 是有符号的,| 的时候,两边自动扩展成 int
b1 << 8 | b2
b1 << 8 = 0.. 0111 1111 0000 0000
b2 作为 byte 是
1000 0000,
扩展成 int 就不得了了,
1.. 1111 1111 1000 0000
然后 b1 << 8 再 | b2, b2 前面都是1,最终结果当然还是
1.. 1111 1111 1000 0000
就是 -128,
正确的做法是:
int result = ((b1 << 8) & 0xFFFF) | (b2 & 0xFF);
结果就正确了
但俺还是不知道为什么 ((b1 << 8) & 0xFFFF) | (b2 & 0xFF)这样就行呢说说道理吧?如果题目要求稍为改一下,把b1和b2还是看作无符号数,其运算方式要求改为:
(b1 <<24) | (b2 <<16),那么实际写java程序时,这一句该写成什么?是不是:((b1 <<24) & 0xffffffff | (b2 <<16) & 0xffffff
这样写对不对?
1111 1111 1111 1111 1111 1111 1000 0000
而0xff的是:0000 0000 0000 0000 1111 1111 1111 1111
两者相&之后,将b2的第0个字节和第1个字节全部改为0了。
0xff 应该是 0000 0000 0000 0000 0000 0000 1111 1111 吧,我为什么在版面上看不到这篇文章了呢?
判断byte小于0,+256就是
int b2 = 0xff;
int b3 = 0xff;
int b4 = 0x80;
int result = (b1 << 24) | (b2 << 16 ) | (b3 << 8) | b4;
System.out.println(String.format("%d", result));