作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在阅读“Java:初学者指南”并且有这样的代码:
class ShowBits{
int numbits;
ShowBits(int n){
numbits = n;
}
void show(long val){
long mask = 1;
mask<<=numbits-1;
int spacer=0;
for(;mask!=0;mask>>>=1){
if(val & mask) != 0) System.out.print("1");
else System.out.print("0");
spacer++;
if((spacer % 8)==0){
System.out.print(" ");
spacer=0;
}
}
System.out.println();
}
}
我看过this question为什么此人的代码不起作用。
但是,我不明白第一个初始左移的目的是
left-shifts a 1 into the proper position
我什至不知道这意味着什么以及为什么您需要 numbits - 1
- 然后在 for 循环中右移。我一直认为右移是为了把代码往下放1
和0
,但我不明白左移的目的。有人可以解释一下吗?也许有一个例子。
最佳答案
您引用的代码看起来很糟糕,不应该出现在书中。
ShowBits
是一个糟糕的类名;它不遵循 Java 命名约定。long
值的位)非常适合简单的 static
方法。numbits
对于不能被 8 整除的数字,输出会产生误导,因为这些位是从左侧而不是右侧分组的。1L << (numbits - 1)
(有适当的间距,中间没有段落。spacer
重置为 0,%
(模)运算符是不必要的。Herbert Schildt 的书通常错误百出,请避免阅读。
回答您的实际问题:int
有 32 位。当你用二进制写下来时,它看起来像这样:
00000000 00000000 00000000 00000000
为了打印二进制数,代码使用位掩码自行提取每一位。位掩码依次获得以下值:
10000000 00000000 00000000 00000000
01000000 00000000 00000000 00000000
00100000 00000000 00000000 00000000
00010000 00000000 00000000 00000000
00001000 00000000 00000000 00000000
00000100 00000000 00000000 00000000
00000010 00000000 00000000 00000000
00000001 00000000 00000000 00000000
00000000 10000000 00000000 00000000
...
这个系列中的第一个值是从 1 开始构造的:
00000000 00000000 00000000 00000001
这个 1 被 <<
向左移动(使用 numbits - 1
运算符)次。所以当numbits
是 32(在我的整个例子中),1 将在最左边的位置结束:
10000000 00000000 00000000 00000000
关于Java:左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185676/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!