Language agnostic 使用位破解将字节转换为特定掩码
我有一个二进制表示的数字Language agnostic 使用位破解将字节转换为特定掩码,language-agnostic,bit-manipulation,Language Agnostic,Bit Manipulation,我有一个二进制表示的数字0000abcd 如何以最少的操作次数将其转换为0a0b0c0d? 如何将0a0b0c0d转换回0000abcd 我在这里寻找解决方案: 及其他 通常情况下,问题比描述的要严重。 给定的第一个数字a₁B₁C₁D₁A.₂B₂C₂D₂和第二个数字a₃A.₄B₃B₄C₃C₄D₃D₄ 如果(a₁和a₂=0),然后清除两个a₃和a₄,如果(a₃和a₄=0),然后清除两个a₁和a₂,等等 我的解决方案: a₁b₁c₁d₁a₂b₂c₂d₂ OR 0 0 0 0 a₁b₁c₁d
0000abcd
如何以最少的操作次数将其转换为0a0b0c0d
?
如何将0a0b0c0d
转换回0000abcd
我在这里寻找解决方案:
及其他
通常情况下,问题比描述的要严重。
给定的第一个数字a₁B₁C₁D₁A.₂B₂C₂D₂代码>和第二个数字a₃A.₄B₃B₄C₃C₄D₃D₄代码>
如果(a₁代码>和a₂代码>=0
),然后清除两个a₃代码>和a₄代码>,如果(a₃代码>和a₄代码>=0
),然后清除两个a₁代码>和a₂代码>,等等
我的解决方案:
a₁b₁c₁d₁a₂b₂c₂d₂
OR 0 0 0 0 a₁b₁c₁d₁ ( a₁b₁c₁d₁a₂b₂c₂d₂ >> 4)
----------------
0 0 0 0 a b c d
? (magic transformation)
? ? ? ? ? ? ? ?
----------------
0 a 0 b 0 c 0 d
OR a 0 b 0 c 0 d 0 (0 a 0 b 0 c 0 d << 1)
----------------
a a b b c c d d
AND a₃a₄b₃b₄c₃c₄d₃d₄
----------------
A₃A₄B₃B₄C₃C₄D₃D₄ (clear bits)
a₁B₁C₁D₁A.₂B₂C₂D₂
或0 0 0 a₁B₁C₁D₁ (一)₁B₁C₁D₁A.₂B₂C₂D₂ >> 4)
----------------
零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零零
? (魔法变换)
? ? ? ? ? ? ? ?
----------------
0A0B0C0D
或0B0C0D0D0(0A0B0C0C0D0D>4)&0x0F
x=(x | x>1)和0x33
y=(y | y>>2)和0x0F
y=(y | y如果要查找最小数量的操作,请使用查找表。不能一次完成,应按位移位:
伪代码:
X1 = a₁b₁c₁d₁
X2 = a₂b₂c₂d₂
Bm = 1 0 0 0 // Bit mask
Result = 0;
while (/* some bytes left */)
{
Result += (X1 and Bm) << 1 or (X2 and Bm);
Bm = Bm shr 1
Result = Result shl 2;
}
X1=a₁B₁C₁D₁
X2=a₂B₂C₂D₂
Bm=1 0//位掩码
结果=0;
而(/*还剩下一些字节*/)
{
结果+=(X1和Bm)我认为这是不可能的(没有查找表)使用二进制算术和x86或x64处理器体系结构在较少的操作中完成。如果我弄错了,请纠正我,但您的问题是关于移动位。在一次操作中获得0a0b0c0d
位。当您看到“a”、“b”、“c”和“d”必须移动多少位时,问题就开始了。
'a' was 4-th, became 7-th, distance travelled 3 bits
'b' was 3-rd, became 5-th, distance travelled 2 bits
'c' was 2-nd, became 3-rd, distance travelled 1 bit
'd' was 1-st, became 1-st, distance travelled 0 bits
没有这样的处理器指令可以将这些位动态地移动到不同的距离。虽然如果您免费使用相同数字的不同输入表示,例如,您已经预先计算了一个周期中使用的几个值,那么可能会获得一些优化,但这就是您得到的效果使用有关拓扑的其他知识时。您只需选择是否:
[4 cycles, n^0 memory]
[2 cycles, n^1 memory]
[1 cycle , n^2 memory]
我有一个二进制数
如何转换
使用最小数量的
手术
这不正是“Y是0”吗?不使用查找表的位旋转黑客有
如何将0a0b0c0d转换回0000abcd
请参阅“太多操作。我查看此解决方案,但没有早午餐:如果(a₁B₁C₁D₁A.₂B₂C₂D₂ & 10001000==0)a₃A.₄B₃B₄C₃C₄D₃D₄ &= 00111111可能是我的解释错误,当然这不是一个单一的操作,我知道位移到了不同的距离。但像“简单方法”一样查找表格-你可以解决,但不理解数字的本质。
[4 cycles, n^0 memory]
[2 cycles, n^1 memory]
[1 cycle , n^2 memory]