查看十六进制数的特定位?
View a specific bit of a hex number?
我正在研究一种逻辑,它会教我位操作和位操作是如何工作的,我正在尝试查看给定十六进制数的特定位。例如 f0f0 具有以下位值 1111000011110000。假设我正在尝试查看第 i^th 位,假设我选择第 4 个位置,我的逻辑应该 return 1. 我尝试通过做这个逻辑:
unsigned int desiredBit = hex & (1 << decimal);
printf("%x\n", desiredBit);
这似乎在位为 0 的任何时候都有效,但只要位为 1,它就会吐出 10 的倍数。我认为做 <<
只会把我带到那个位置,但我我猜我错了。关于如何修复我的逻辑的任何指导?
你得到的实际上是 2 的倍数,即这个特定位的 "weight" 如果它被设置,否则为 0。如果您只是想知道它是否已设置,请检查此权重是否为 != 0 或不是:
尝试
unsigned int setOrNot = (hex & (1 << decimal)) != 0;
你得到的数字的数值只有那个位设置,这不完全是 1
除非它是 LSB。
例如,对于数字 0b11100101
,如果您屏蔽掉第二个 MSB (0b11100101 & 0b01000000
),则结果为 0b01000000
,即以 10 为基数的 64。
如果您希望结果为 1
或 0
,您可以对整个操作执行 !!
,即 printf("%d\n", !!(num1 & num2));
将始终为 1
如果该位已设置或 0
如果未设置。
我正在研究一种逻辑,它会教我位操作和位操作是如何工作的,我正在尝试查看给定十六进制数的特定位。例如 f0f0 具有以下位值 1111000011110000。假设我正在尝试查看第 i^th 位,假设我选择第 4 个位置,我的逻辑应该 return 1. 我尝试通过做这个逻辑:
unsigned int desiredBit = hex & (1 << decimal);
printf("%x\n", desiredBit);
这似乎在位为 0 的任何时候都有效,但只要位为 1,它就会吐出 10 的倍数。我认为做 <<
只会把我带到那个位置,但我我猜我错了。关于如何修复我的逻辑的任何指导?
你得到的实际上是 2 的倍数,即这个特定位的 "weight" 如果它被设置,否则为 0。如果您只是想知道它是否已设置,请检查此权重是否为 != 0 或不是:
尝试
unsigned int setOrNot = (hex & (1 << decimal)) != 0;
你得到的数字的数值只有那个位设置,这不完全是 1
除非它是 LSB。
例如,对于数字 0b11100101
,如果您屏蔽掉第二个 MSB (0b11100101 & 0b01000000
),则结果为 0b01000000
,即以 10 为基数的 64。
如果您希望结果为 1
或 0
,您可以对整个操作执行 !!
,即 printf("%d\n", !!(num1 & num2));
将始终为 1
如果该位已设置或 0
如果未设置。