请考虑以下代码段:
input.setInputType(
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
做了什么?我之前从未遇到过java。
答案 0 :(得分:3)
这是一个按位或者,如果你有二进制值,或者它们各自在一起
00010110
10110000
---------
10110110
对于每个位,输出将为0
,如果相应输入位的两个都为0
。如果输入的位中的任何一个或两个都具有1
,则它将在该插槽中输出1
。
它有点像||
,除了检查每个位而不是整数。
在你的情况下
您的特定示例的方式是将2个条件编码为单个值,与屏蔽有关。
假设InputType.TYPE_CLASS_TEXT
等于8
或00001000
假设InputType.TYPE_TEXT_VARIATION_PASSWORD
等于32
或00100000
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD
等于00101000
或40
。
如果要阅读它们,请使用按位和。这与oring完全相反。仅当两个值均为1时,IT才返回true。
00010110
10110000
---------
00010000
要检查您的值是否包含结果,只需将and
改为
00101000 - 40 - Your result
00001000 - 8 - InputType.TYPE_CLASS_TEXT
--------
00001000 - 8 - this means that your result contains `InputType.TYPE_CLASS_TEXT`
在代码中,检查可能如下所示。
if(myInputType & InputType.TYPE_CLASS_TEXT != 0)
//myinput type cointains TYPE_CLASS_TEXT
答案 1 :(得分:3)
假设你有一些整数常数,W = 1,X = 2,Y = 4,Z = 8
这些的位表示是: 0001 0010 0100 1000
您可以“或”将它们一起请求W / X / Y / Z的任意组合,并将它们作为单个参数传递。假设我想要X和Y特征而不是W和Z:
0010 | 0100 == 0110 (6)
所以我用(X | Y)调用函数,函数可以按位 - 和各个选项的参数(并测试!= 0)看看哪些被选中:
0110 & W == 0000 == 0
0110 & X == 0010 != 0
0110 & Y == 0100 != 0
0110 & Z == 0000 == 0
请注意我如何仔细选择输入为2的所有不同幂。这意味着每个特征的二进制表示将始终只有一个唯一位设置为“on” - 这是制作整个标志传递系统的关键工作
答案 2 :(得分:1)
这是一个按位OR运算符。它用于将标志值组合成一个整数值,该值按位包含所有不同标志的true / false值。
基本上使用单个整数作为真/假值列表。
在这种情况下,假设InputType。TYPE_CLASS_TEXT
的值为2(或二进制为10)和InputType。TYPE_TEXT_VARIATION_PASSWORD
的值为4(或二进制为100)。
按位OR然后将10和100组合成110或6.从值6开始,调用代码可以唯一地确定标志TYPE_CLASS_TEXT
和TYPE_TEXT_VARIATION_PASSWORD
都已传递给它。
答案 3 :(得分:0)
就像已经提到的那样,它是一个按位OR运算符。这个想法是节省一些内存并在单个int中存储多个标志。