gpt4 book ai didi

c - 仅使用 OR 和 AND 实现位移位

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:02 25 4
gpt4 key购买 nike

<分区>

我想为我的虚拟 CPU 实现 SHL64 和 SHR64。我的 CPU 只有四个从 NAND 实现的指令,可以执行任何 if 语句(所有比较操作)

  • 不是
  • 或者
  • CMP(有符号/无符号/从 8b 到 64b 的任何类型)

目前我通过以下操作实现了 SHR64:~ & | + - %

我对 SHR64 的实现:

#include <cstdint>
#include <iostream>

const uint64_t mask[]={
0x1,0x2,0x4,0x8,
0x10,0x20,0x40,0x80,
0x100,0x200,0x400,0x800,
0x1000,0x2000,0x4000,0x8000,
0x10000,0x20000,0x40000,0x80000,
0x100000,0x200000,0x400000,0x800000,
0x1000000,0x2000000,0x4000000,0x8000000,
0x10000000,0x20000000,0x40000000,0x80000000,
0x100000000,0x200000000,0x400000000,0x800000000,
0x1000000000,0x2000000000,0x4000000000,0x8000000000,
0x10000000000,0x20000000000,0x40000000000,0x80000000000,
0x100000000000,0x200000000000,0x400000000000,0x800000000000,
0x1000000000000,0x2000000000000,0x4000000000000,0x8000000000000,
0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,
0x100000000000000,0x200000000000000,0x400000000000000,0x800000000000000,
0x1000000000000000,0x2000000000000000,0x4000000000000000,0x8000000000000000
};

uint64_t GET_MASK(uint32_t i)
{
return mask[i];
}

inline uint64_t IfThen(uint64_t trueAddr,uint64_t falseAddr,int condition)
{
uint64_t c=UINT64_MAX;
if(!(condition))
{
c=0;
}
return (trueAddr&c) | (falseAddr&(~c));
}

int64_t Shr64(int64_t a,uint8_t b)
{
int64_t iRet=0;
int32_t aBit;
int32_t count=64;
b%=count;

count=(int32_t)count - b;

for(int32_t i=0; i < count; i++)
{
aBit=(a & GET_MASK(i + b)) != 0;
iRet=(int64_t)(iRet | IfThen(GET_MASK(i),0,aBit));
}
return iRet;
}

int main()
{
uint64_t test=Shr64(23,2);
std::cout << "My impl " << test << std::endl;
std::cout << "Default " << (23 >> 2) << std::endl;
}

SHL64 可以用类似的方式实现。

有人可以根据以下规则帮助实现 SHR 和 SHL:

  1. 如果语句允许,仅使用 NOT、OR 和 AND。
  2. 没有循环
  3. 与原始操作相比速度不错(最多可以慢 20 倍)

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com