java中数据用二进制表示

AC_YE 2021-03-02 08:02:05
java中不是用0b来表示二进制数吗,为什么提示语法错误
...全文
2564 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
张凯1 2021-03-10
  • 打赏
  • 举报
回复
引用 15 楼 冰思雨 的回复:
[quote=引用 2 楼 ~Commodity 的回复:][quote=引用 1 楼 qybao的回复:]没有二进制表示方法 可以用Integer的parseInt或valueOf 比如 int c = Integer.parseInt(“10100001”, 2) & Integer.parseInt(“10000000”, 2);
为什么~11011110结果为11111111111111111111111100100001?为什么会这样[/quote] 这个是计算机基础方面的问题。 计算机表示整数,存在两种整数,一种是无符号的整数,一种是带符号的整数。 带符号的整数,会把第一个bit位拿出来,表示是否是负数,也就是正负符号。 如果是负数,计算机里面表示负数,是用负数的补码进行表示的。 “10100001” 这个作为一个带符号的二进制数,第一个bit位是1,说明这是个负数。 如果将这个二进制数,解析成32位的二进制数,前面必须补足够位数的1才能保证数值不变。 如果全补0的话,负数就变成整数了。 如果第一个bit位补1,其余bit位补0,那么,数值和输入的参数所表示的整数值就不一致了。 因为,负数是用补码表示的。 如果不知道什么是补码,楼主还是自己想办法补一补吧。 为啥参数的二进制是带符号的?因为这个函数就是这么规定的。你觉得不满意,自己可以写一个自己满意函数。[/quote]有关原码,反码和补码,这里有答案https://blog.csdn.net/qq_37684467/article/details/114366711?utm_source=app&app_version=4.5.2
华尔街的牛 2021-03-07
  • 打赏
  • 举报
回复
推荐论坛地址
luj_1768 2021-03-05
  • 打赏
  • 举报
回复
maybe: c=(0bxxxxx)&&(0bxxxxx);
冰思雨 2021-03-04
  • 打赏
  • 举报
回复
将 JDK 换成 JDK7 以后的版本。 JDK6,JDK5是不支持这种写法的。
冰思雨 2021-03-04
  • 打赏
  • 举报
回复
引用 楼主 ~Commodity 的回复:
java中不是用0b来表示二进制数吗,为什么提示语法错误
语法没有问题,我已经在我的本地环境验证过了。 根据经验判断,应该是楼主使用的编译工具的版本还不支持0b开头,表示二进制,这个语法。 楼主查看一下JDK的版本。7以后的版本才支持0b开头表示二进制。
qybao 2021-03-04
  • 打赏
  • 举报
回复
引用 12 楼 ~Commodity 的回复:
直接输入11111111 11111111 11111111 10100001在parseInt里面会报错,怎样将这个二进制转换成十进制,用这个方法转不了
好吧,发现parseInt的一个问题,它是用原码来输入的,所以只能输入31的正数原码,而输入负数,就必须带个负号 比如 System.out.println(Integer.parseInt("-00000000000000000000000000000001", 2)); //-1的原码加上负号 System.out.println(Integer.toBinaryString(-1)); //但是输出时却是补码,不能用该补码带入上面的输入,只能用上面负号+原码的方式来输入
qybao 2021-03-04
  • 打赏
  • 举报
回复
引用 12 楼 ~Commodity 的回复:
直接输入11111111 11111111 11111111 10100001在parseInt里面会报错,怎样将这个二进制转换成十进制,用这个方法转不了
好吧,发现parseInt的一个问题,它是用原码来输入的,所以只能输入31的正数原码,而输入负数,就必须带个负号 比如 System.out.println(Integer.parseInt("-00000000000000000000000000000001", 2)); //-1的原码加上负号 System.out.println(Integer.toBinaryString(-1)); //但是输出时却是补码,不能用该补码带入上面的输入,只能用上面负号+原码的方式来输入
冰思雨 2021-03-04
  • 打赏
  • 举报
回复
引用 2 楼 ~Commodity 的回复:
[quote=引用 1 楼 qybao的回复:]没有二进制表示方法 可以用Integer的parseInt或valueOf 比如 int c = Integer.parseInt(“10100001”, 2) & Integer.parseInt(“10000000”, 2);
为什么~11011110结果为11111111111111111111111100100001?为什么会这样[/quote] 这个是计算机基础方面的问题。 计算机表示整数,存在两种整数,一种是无符号的整数,一种是带符号的整数。 带符号的整数,会把第一个bit位拿出来,表示是否是负数,也就是正负符号。 如果是负数,计算机里面表示负数,是用负数的补码进行表示的。 “10100001” 这个作为一个带符号的二进制数,第一个bit位是1,说明这是个负数。 如果将这个二进制数,解析成32位的二进制数,前面必须补足够位数的1才能保证数值不变。 如果全补0的话,负数就变成整数了。 如果第一个bit位补1,其余bit位补0,那么,数值和输入的参数所表示的整数值就不一致了。 因为,负数是用补码表示的。 如果不知道什么是补码,楼主还是自己想办法补一补吧。 为啥参数的二进制是带符号的?因为这个函数就是这么规定的。你觉得不满意,自己可以写一个自己满意函数。
qybao 2021-03-03
  • 打赏
  • 举报
回复
引用 4 楼 ~Commodity 的回复:
这个0b10100001是二进制的什么形式,是补码还是原码
你这个问题有点暧昧??目前的计算机都是采用补码的形式存储,所以你的输入会被解析为补码。(正数的补码就是原码本身,负数的补码和原码的反码+1,对于你的输入,计算机是原样解析存储的,所以得到的就是补码,你可以试试输入一个负数的原码看看计算机i解析为什么?肯定解析结果不是你的期待结果,但是你输入一个负数的补码看看,应该就是你的期待结果)
AC_YE 2021-03-03
  • 打赏
  • 举报
回复
引用 3 楼 qybao的回复:
[quote=引用 2 楼 ~Commodity 的回复:] 为什么~11011110结果为11111111111111111111111100100001?为什么会这样
因为java的int是32为,~11011110其实是~00000000 00000000 00000000 11011110 (高位补0) 所以结果就是 11111111 11111111 11111111 00100001 如果你只想用8位的数据,应该用byte类型而不是int类型 [/quote] ~11011110得到的是11111111 11111111 11111111 00100001这个是补码还是原码,计算机是拿补码进行运算,得出的结果再转换成原码来进行打印输出吗?
AC_YE 2021-03-03
  • 打赏
  • 举报
回复
引用 3 楼 qybao的回复:
[quote=引用 2 楼 ~Commodity 的回复:] 为什么~11011110结果为11111111111111111111111100100001?为什么会这样
因为java的int是32为,~11011110其实是~00000000 00000000 00000000 11011110 (高位补0) 所以结果就是 11111111 11111111 11111111 00100001 如果你只想用8位的数据,应该用byte类型而不是int类型 [/quote] 这个0b10100001是二进制的什么形式,是补码还是原码
qybao 2021-03-03
  • 打赏
  • 举报
回复
引用 2 楼 ~Commodity 的回复:
为什么~11011110结果为11111111111111111111111100100001?为什么会这样
因为java的int是32为,~11011110其实是~00000000 00000000 00000000 11011110 (高位补0) 所以结果就是 11111111 11111111 11111111 00100001 如果你只想用8位的数据,应该用byte类型而不是int类型
AC_YE 2021-03-03
  • 打赏
  • 举报
回复
引用 11 楼 qybao的回复:
[quote=引用 9 楼 ~Commodity 的回复:][quote=引用 7 楼 qybao的回复:][quote=引用 5 楼 ~Commodity 的回复:] ~11011110得到的是11111111 11111111 11111111 00100001这个是补码还是原码,计算机是拿补码进行运算,得出的结果再转换成原码来进行打印输出吗?
你想得到什么样的结果?这要看你的需求。如果只想保留最低8位,你可以用&来去掉高位 即 (~11011110) & 0xFF //只保留低8位 [/quote] 这个0b10100001是正数还是负数?这个是原码吗,如果是原码最高位就是1那就是负数吗?[/quote] 这个不是也说了吗,java的int是32位,你这样写是表示高位都为0,所以是正数,你如果要作为负数输入, 那就改为 11111111 11111111 11111111 10100001 这样来输入,或者你输入后,自己 | 运算一下 即 c = (0b10100001) | 0xFFFFFF00[/quote] 直接输入11111111 11111111 11111111 10100001在parseInt里面会报错,怎样将这个二进制转换成十进制,用这个方法转不了
qybao 2021-03-03
  • 打赏
  • 举报
回复
引用 9 楼 ~Commodity 的回复:
[quote=引用 7 楼 qybao的回复:][quote=引用 5 楼 ~Commodity 的回复:] ~11011110得到的是11111111 11111111 11111111 00100001这个是补码还是原码,计算机是拿补码进行运算,得出的结果再转换成原码来进行打印输出吗?
你想得到什么样的结果?这要看你的需求。如果只想保留最低8位,你可以用&来去掉高位 即 (~11011110) & 0xFF //只保留低8位 [/quote] 这个0b10100001是正数还是负数?这个是原码吗,如果是原码最高位就是1那就是负数吗?[/quote] 这个不是也说了吗,java的int是32位,你这样写是表示高位都为0,所以是正数,你如果要作为负数输入, 那就改为 11111111 11111111 11111111 10100001 这样来输入,或者你输入后,自己 | 运算一下 即 c = (0b10100001) | 0xFFFFFF00
qybao 2021-03-03
  • 打赏
  • 举报
回复
引用 8 楼 ~Commodity 的回复:
[quote=引用 6 楼 qybao的回复:][quote=引用 4 楼 ~Commodity 的回复:] 这个0b10100001是二进制的什么形式,是补码还是原码
你这个问题有点暧昧??目前的计算机都是采用补码的形式存储,所以你的输入会被解析为补码。(正数的补码就是原码本身,负数的补码和原码的反码+1,对于你的输入,计算机是原样解析存储的,所以得到的就是补码,你可以试试输入一个负数的原码看看计算机i解析为什么?肯定解析结果不是你的期待结果,但是你输入一个负数的补码看看,应该就是你的期待结果) [/quote] 我是想问就是输入的数据是被转化成补码进行运算,那运算的结果还是补码,那是原样输出还是将得到该结果转换成原码输出,就是运算后得到一个补码,是以二进制的什么形式打印到控制台,是补码还是原码?[/quote] 不是说了吗,是补码(不管是输入还是输出),你可以试试用Integer.toBinaryString(-1),打印出来看看就知道了(结果肯定不是-1的原码)
AC_YE 2021-03-03
  • 打赏
  • 举报
回复
引用 7 楼 qybao的回复:
[quote=引用 5 楼 ~Commodity 的回复:] ~11011110得到的是11111111 11111111 11111111 00100001这个是补码还是原码,计算机是拿补码进行运算,得出的结果再转换成原码来进行打印输出吗?
你想得到什么样的结果?这要看你的需求。如果只想保留最低8位,你可以用&来去掉高位 即 (~11011110) & 0xFF //只保留低8位 [/quote] 这个0b10100001是正数还是负数?这个是原码吗,如果是原码最高位就是1那就是负数吗?
AC_YE 2021-03-03
  • 打赏
  • 举报
回复
引用 6 楼 qybao的回复:
[quote=引用 4 楼 ~Commodity 的回复:] 这个0b10100001是二进制的什么形式,是补码还是原码
你这个问题有点暧昧??目前的计算机都是采用补码的形式存储,所以你的输入会被解析为补码。(正数的补码就是原码本身,负数的补码和原码的反码+1,对于你的输入,计算机是原样解析存储的,所以得到的就是补码,你可以试试输入一个负数的原码看看计算机i解析为什么?肯定解析结果不是你的期待结果,但是你输入一个负数的补码看看,应该就是你的期待结果) [/quote] 我是想问就是输入的数据是被转化成补码进行运算,那运算的结果还是补码,那是原样输出还是将得到该结果转换成原码输出,就是运算后得到一个补码,是以二进制的什么形式打印到控制台,是补码还是原码?
qybao 2021-03-03
  • 打赏
  • 举报
回复
引用 5 楼 ~Commodity 的回复:
~11011110得到的是11111111 11111111 11111111 00100001这个是补码还是原码,计算机是拿补码进行运算,得出的结果再转换成原码来进行打印输出吗?
你想得到什么样的结果?这要看你的需求。如果只想保留最低8位,你可以用&来去掉高位 即 (~11011110) & 0xFF //只保留低8位
AC_YE 2021-03-02
  • 打赏
  • 举报
回复
引用 1 楼 qybao的回复:
没有二进制表示方法 可以用Integer的parseInt或valueOf 比如 int c = Integer.parseInt(“10100001”, 2) & Integer.parseInt(“10000000”, 2);
为什么~11011110结果为11111111111111111111111100100001?为什么会这样
qybao 2021-03-02
  • 打赏
  • 举报
回复
没有二进制表示方法 可以用Integer的parseInt或valueOf 比如 int c = Integer.parseInt(“10100001”, 2) & Integer.parseInt(“10000000”, 2);

62,610

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧