【问题标题】:if statement byte versus integerif 语句字节与整数
【发布时间】:2018-12-19 09:24:29
【问题描述】:

我试图理解下面与演示位运算符相关的一段代码(摘录),特别是 if 语句 ((if ((b & t)...)

变量b 是字节类型和t int。我无法确定如何在循环中测试两种不同的变量类型不等于 0。该程序只是继续翻转位。但是,我无法解决这个问题。它在 Eclipse 中运行良好。有什么想法吗?

class NotDemo {
    public static void main(String args []) {
        byte b = -34; 
        for (int t=128; t > 0; t = t/2 ) {
            if((b & t) != 0) System.out.print("1 ");
            else System.out.print("0 ");

【问题讨论】:

  • Java 隐式转换 byte 到 int。它将执行byte 到short,short 到int,int 到long,char 到int(!),int 到float(! 987654338@ 到 double 以及它们的传递闭包。
  • 还有long 到double (!)。 (即使您喜欢隐式转换,标有 (!) 的那些也可能是个坏主意。)

标签: java implicit-conversion


【解决方案1】:

b & t 对两个ints 执行按位与。 byte b 被提升为 int。

它打印-34的二进制表示的位。

-34的二进制表示是11011110。

t 得到值 128,64,32,16,8,4,2,1,二进制是

10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

当您将t 的这些值与b 进行逐位与运算时,只有当t 和b 在同一位置有一个“1”位时,您才会得到非0 结果。

10000000 & 11011110 = 10000000 -> 1 printed
01000000 & 11011110 = 01000000 -> 1 printed
00100000 & 11011110 = 00000000 -> 0 printed
00010000 & 11011110 = 00010000 -> 1 printed
00001000 & 11011110 = 00001000 -> 1 printed
00000100 & 11011110 = 00000100 -> 1 printed
00000010 & 11011110 = 00000010 -> 1 printed
00000001 & 11011110 = 00000000 -> 0 printed

编辑:这个解释并不完全准确。对两个ints(即两个32位数字)执行按位与,但由于t的前24位是0,因此它们不会影响结果。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多