按位与运算符 - 它用于递减前一个位间隔吗?
Bitwise AND operator - Is it used to decrement previous bit interval?
我不确定如何用这个问题的主题来表达,因为我是位操作的新手,真的不明白它是如何工作的。
我正在对一个游戏应用程序进行逆向工程,只是为了看看它是如何工作的,并想弄清楚“&”运算符在方法中的使用情况。
部分代码:
int n = (random numbers will be provided below)
int n2 = n & 1920 // interested in this line of code
switch (n2){
//ignore n2 value assignment inside of cases
case 256: {
n2 = 384;
break;
case 384: {
n2 = 512;
break;
case 512: {
n2 = 0
break;
测试值:
Input Values | Output Values | Substituting Values
n = 387 | n2 = 384 | ( 387 & 1920 ) = 384
n = 513 | n2 = 512 | ( 513 & 1920 ) = 512
n = 12546 | n2 = 256 | ( 12546 & 1920 ) = 256
n = 18690 | n2 = 256 | ( 18690 & 1920 ) = 256
基于这个用例我有几个问题:
在此示例中,& 运算符在做什么?
- 对我来说,除了大于 10000 的数字外,大多数值似乎都被四舍五入到最接近的位间隔
数字 1920
有什么重要的?
他们是如何得出这个数字来达到特定位间隔的? (如果可能的话)
要了解位操作,您需要做的第一件事是将所有以 10 为底的十进制数转换为显示位的数字格式,即以 2 为底的二进制数或以 16 为底的十六进制数(如果您我已经学会阅读这些了)。
位从右开始编号,从 0 开始。
Decimal Hex Binary
256 = 0x100 = 0b1_0000_0000
384 = 0x180 = 0b1_1000_0000
512 = 0x200 = 0b10_0000_0000
1920 = 0x780 = 0b111_1000_0000
| | | | |
10 8 7 4 0 Bit Number
如您所见,n & 1920
将清除除第 7-10 位以外的所有内容。
只要 n
没有任何大于 10 的设置位,即大于 0x7FF = 2047
,效果如您所说,值将向下舍入(截断)到最近的位间隔,即 128 的倍数。
128 + 256 + 512 + 1024 = 1920.
These are also powers of 2. let ^ be power of.
128 = 2^7
256 = 2^8
512 = 2^9
1024 = 2^10
指数也代表位在数字中的位置,从右到左从位 0 开始。
通过将 a 值与 1920 进行与运算,您可以查看是否设置了任何位。
假设您想查看 n 是否只设置了第 7 位。
if ((n & 1920) == 128) {
// it is set.
}
或者查看它是否设置了第 7 位和第 8 位。
if ((n & 1920) == 384) {
// then those bits are set.
}
您还可以使用 |
设置特定位。
n |= 128. Set's bit 7 to 1.
我不确定如何用这个问题的主题来表达,因为我是位操作的新手,真的不明白它是如何工作的。
我正在对一个游戏应用程序进行逆向工程,只是为了看看它是如何工作的,并想弄清楚“&”运算符在方法中的使用情况。
部分代码:
int n = (random numbers will be provided below)
int n2 = n & 1920 // interested in this line of code
switch (n2){
//ignore n2 value assignment inside of cases
case 256: {
n2 = 384;
break;
case 384: {
n2 = 512;
break;
case 512: {
n2 = 0
break;
测试值:
Input Values | Output Values | Substituting Values
n = 387 | n2 = 384 | ( 387 & 1920 ) = 384
n = 513 | n2 = 512 | ( 513 & 1920 ) = 512
n = 12546 | n2 = 256 | ( 12546 & 1920 ) = 256
n = 18690 | n2 = 256 | ( 18690 & 1920 ) = 256
基于这个用例我有几个问题:
在此示例中,& 运算符在做什么?
- 对我来说,除了大于 10000 的数字外,大多数值似乎都被四舍五入到最接近的位间隔
数字 1920
有什么重要的?
他们是如何得出这个数字来达到特定位间隔的? (如果可能的话)
要了解位操作,您需要做的第一件事是将所有以 10 为底的十进制数转换为显示位的数字格式,即以 2 为底的二进制数或以 16 为底的十六进制数(如果您我已经学会阅读这些了)。
位从右开始编号,从 0 开始。
Decimal Hex Binary
256 = 0x100 = 0b1_0000_0000
384 = 0x180 = 0b1_1000_0000
512 = 0x200 = 0b10_0000_0000
1920 = 0x780 = 0b111_1000_0000
| | | | |
10 8 7 4 0 Bit Number
如您所见,n & 1920
将清除除第 7-10 位以外的所有内容。
只要 n
没有任何大于 10 的设置位,即大于 0x7FF = 2047
,效果如您所说,值将向下舍入(截断)到最近的位间隔,即 128 的倍数。
128 + 256 + 512 + 1024 = 1920.
These are also powers of 2. let ^ be power of.
128 = 2^7
256 = 2^8
512 = 2^9
1024 = 2^10
指数也代表位在数字中的位置,从右到左从位 0 开始。
通过将 a 值与 1920 进行与运算,您可以查看是否设置了任何位。
假设您想查看 n 是否只设置了第 7 位。
if ((n & 1920) == 128) {
// it is set.
}
或者查看它是否设置了第 7 位和第 8 位。
if ((n & 1920) == 384) {
// then those bits are set.
}
您还可以使用 |
设置特定位。
n |= 128. Set's bit 7 to 1.