Java将变量中的数据用“二进制”格式输出的方法

    今天,在编写一段程序时需要将byte类型的数据,用“二进制”形式的字符串输出,冥思苦想也不知道如何入手。忽然灵机一动记得Java中的Integer包装器类有一个toBinaryString(int i)以二进制(基数2)无符号整数形式返回一个整数参数的字符串表示形式的方法。

查找 Java源代码文件 Integer.java找到方法源码如下:
public   static  String toBinaryString( int  i)  {
    
return toUnsignedString(i, 1);
    }
实际上调用的是 toUnsignedString(i, 1); 方法 再继续查找源码如下:
/**
     * Convert the integer to an unsigned number.
     
*/

    
private   static  String toUnsignedString( int  i,  int  shift)  {
    
char[] buf = new char[32];
    
int charPos = 32;
    
int radix = 1 << shift;
    
int mask = radix - 1;
    
do {
        buf[
--charPos] = digits[i & mask];
        i 
>>>= shift;
    }
 while (i != 0);
    
return new String(buf, charPos, (32 - charPos));
    }
其中,方法中需要使用的数组 digits[]定义如下:
final   static   char [] digits  =   {
    
'0' , '1' , '2' , '3' , '4' , '5' ,
    
'6' , '7' , '8' , '9' , 'a' , 'b' ,
    
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
    
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
    
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
    
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
 }
;
好了,源码已经找到了。现在就开始分析 Java类库的设计师们是如何实现它的吧。假设我们这样调用 toUnsignedString(5, 1); 方法。
1)  char[] buf = new char[32]; // 创建一个char型数组长度32(int型数据在java中是32位的)存放计算后数据。
2)  int charPos = 32; // 计数器
int radix = 1 << shift; // 注意这个地方1是个整型值(32位),它被左移了1位右边空出的用0补充,然后再赋值给了radix。下图是左移前与左移后数据1的二进制表式图: 
  4) int mask = radix - 1;
关键算法如下:
5) do {
6)     buf[--charPos] = digits[i & mask];
7)     i >>>= shift;
8) } while (i != 0);
6) buf[--charPos] 因为数组下标是从0开始的,所以起始索引为31(对应内存中的第32位)。digits[i & mask]内存表示图如下:

7)i>>>=shift;

8)  } while (i != 0);//i=2 != 0循环继续5-7步,直至i=0结束循环至此程序运行结束。

9return new String(buf, charPos, (32 - charPos));//调用String类的构造函数,创建一个指定字符数组的字符串对像,程序看到这里问题已经得到解决,下面的代码我就不深究了如果大家感兴趣可以去看源代码。

    总结:研究了Java源代码后对toBinaryString(int i)方法有了更深入的了解, Java库设计师们通过空间来换取速度,不过想想这种浪费空间的方法还是值得的。当然解决问题方法不仅仅只有这一种。

在UView 2.x版本的UI框架中,如果你想要禁用`u-upload`组件的隐藏上传功能,通常意味着不让用户直接查看或操作上传文件的操作,你可以通过设置组件的一些属性来控制这个行为。具体步骤如下: 1. 首先,在你的Vue组件中引入`u-upload`组件,并给它一个引用名,例如`uploadFile`: ```html <u-upload ref="uploadFile" :auto-upload="false"></u-upload> ``` 这里`:auto-upload="false"`表示默认不自动上传,用户需要手动触发。 2. 然后,你可以通过`v-model`绑定一个变量来控制是否显示上传按钮或者预览区域,当该变量为`false`或`null`时,可以隐藏上传相关的元素: ```html <template> <div> <button @click="toggleUpload">上传</button> <u-file-preview v-if="shouldShowPreview" :file-list="fileList"></u-file-preview> <u-upload v-show="shouldShowUpload" ref="uploadFile" :auto-upload="shouldAutoUpload" :before-upload="beforeUpload" :on-change="onChange"> <!-- 其他上传配置 --> </u-upload> </div> </template> <script> export default { data() { return { shouldShowUpload: true, shouldShowPreview: true, fileList: [], shouldAutoUpload: false, // ...其他数据 }; }, methods: { toggleUpload() { this.shouldShowUpload = !this.shouldShowUpload; }, beforeUpload(file) { // 这里可以根据需求处理上传前的行为,比如限制文件大小等 return true; // 返回true表示允许上传,false表示阻止 }, onChange({ file }) { this.fileList.push(file); }, } }; </script> ``` 通过这种方式,你可以动态地控制`u-upload`组件的可见性和交互性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值