概述
这里写自定义目录标题
- 事由
- 运行结果如下
- & 与运算
- **==如何在二进制中表示复数?==**
- 原码,反码,补码
- 一颗大栗子
- over!!!
事由
周五有点无聊没事看书看到了这个注意,然后就想着动手实现一下。
Byte.toUnsignedInt(c);
int a = Byte.toUnsignedInt((byte) -1);
int b = Byte.toUnsignedInt((byte) -2);
int h = Byte.toUnsignedInt((byte) 1);
System.out.println(a);
System.out.println(b);
System.out.println(c);
运行结果如下
看到结果引起了我的深思 靠! 这么奇怪x值为-1 其值255 ,为1时127。一下没忍住就把它源码扒出来看看。
public static int toUnsignedInt(byte x) {
return ((int) x) & 0xff;
}
/**
* Converts the argument to a {@code long} by an unsigned
* conversion.
In an unsigned conversion to a {@code long}, the
* high-order 56 bits of the {@code long} are zero and the
* low-order 8 bits are equal to the bits of the {@code byte} argument.
*
* Consequently, zero and positive {@code byte} values are mapped
* to a numerically equal {@code long} value and negative {@code
* byte} values are mapped to a {@code long} value equal to the
* input plus 2<sup>8</sup>.
*
* @param
x the value to convert to an unsigned {@code long}
* @return the argument converted to {@code long} by an unsigned
*
conversion
* @since 1.8
*/
好吧 下面的注释我一个都看不懂但不影响我看代码。
将x强制转化成int 类型再与0xff 进行与运算。
以为就到这了? 其实吧并没有 毕竟我准备水点字。就再扒一下,毕竟我菜鸟的嘛 有太多不会的了
& 与运算
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:两位同时为“1”,结果才为“1”,否则为0
1.举个栗子
例如:1&3即 0000 0001 & 0000 0011 = 0000 0001因此,1&3的值得1。
另,负数按补码形式参加按位与运算。
如何在二进制中表示复数?
好问题!!!! 我也不晓得 毕竟是菜鸟嘛 所以我就去问了问度娘。
概括一下就是: 取其正整数的原码再取反码,反码的补码,就是负整数的二进制
确实有点绕,那看图吧
补码就是负数的二进制
原码,反码,补码
顺手百度不谢不谢
原码:一个整数,按照绝对值大小转换成的二进制数。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码
补码:反码最右边+1
一颗大栗子
x为-1,其数据类型为Byte 二进制为:
还是算一下吧
1 的原码为 0000 0001
反码为 1111 1110
补码为 1111 1111
int(x) 强制转换 x从一个字节八位变成了 4个字节 32位,高24位填充1
(问为什么填充1 以为其为正数时高位全填充了0 )
‘24个1’ 1111 1111
0xff 为16进制 转换成十进制是 255 二进制 巧了“24个0” 1111 1111
然后与运算
x: 1111 1111
oxff: 1111 1111
结果为
1111 1111 (没错就是它本身255)
over!!!
最后
以上就是优美睫毛为你收集整理的Byte.toUnsignedInt() +与运算 原码,反码,补码事由的全部内容,希望文章能够帮你解决Byte.toUnsignedInt() +与运算 原码,反码,补码事由所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复