草庐IT

c++十进制转二进制,然后用运算,再转回十进制

coder 2024-02-19 原文

我有一个包含 x 个数字的数组:sets[ ](长数字)和一个包含 x-1 个数字的 char 数组 operations[ ]。对于 sets[ ] 中的每个数字,其二进制形式(64 位)将与一组数字(这些数字从 0 到 63)相同,1 和 0 表示它是否在子集中( 1 2 4将是 1 1 0 1,因为缺少 3)

例如:十进制 5 --->000...00101 ,这意味着该子集将只有最后两个数字(#63 和 #61)

现在,使用我在操作 [] 中获得的字符,我应该使用它们和这些数字的二进制文件,就好像它们是对子集的操作(我希望子集是正确的词),这些操作是:

U = 团聚 ---> 101 U 010 = 111

A = 交叉点 ---> 101 A 001 = 001

\= A - B ---> 1110 - 0011 = 1100

/= B-A ---> 和上一个一样

所以基本上我必须读取数字,将它们转换为二进制,将它们当作集合来使用并相应地使用操作,然后返回对它们进行的所有这些操作的结果。

我的代码:

include <iostream>

using namespace std;


void makeBinaryVector(int vec[64], long xx)  
{

// put xx in binary form in array "vec[]"
int k = 63;
long x = xx;

if(xx == 0)
    for(int i=0;i<64;i++)
        vec[i] = 0;


while(x != 0)
{
    vec[k] = x % 2;
    x = x / 2;
    k--;
}
}

void OperationInA(int A[64], char op, int B[64])
{
int i;
if(op == 'U')           //reunion
    for(i=0;i<64;i++)      
        if(B[i] == 1)
            A[i] = 1;

if(op == 'A')           //intersection
    for(i=0;i<64;i++)
    {
        if((B[i] == 1) && (A[i] == 1))
            A[i] = 1;
        else
            A[i] = 0;
    }

if(op == '\\')          //A-B
    for(i=0;i<64;i++)   
    {
        if( (A[i] == 0 && B[i] == 0) || (A[i] == 0 && B[i] == 1) )
            A[i] = 0;
        else

            if((A[i] == 1) && (B[i] == 1))
                A[i] = 0;
            else
                if((A[i] == 1) && (B[i] == 0))
                    A[i] = 1;
    }

if(op == '/')           //B-A
    for(i=0;i<64;i++)   
    {
        if(B[i] == 0)
            A[i] = 0;
        else

            if((B[i] == 1) && (A[i] == 0))
                A[i] = 1;
            else
                if((B[i] == 1) && (A[i] == 1))
                    A[i] = 0;
    }

}


unsigned long setOperations(long sets[], char operations[], unsigned int x)
{

unsigned int i = 1;     //not 0, since i'll be reading the 1st number separately
unsigned int j = 0;
unsigned int n = x;
int t;
long a = sets[0];
int A[64];              
for(t=0;t<64;t++)
    A[t] = 0;

makeBinaryVector(A, a);  //hold in A the first number, binary, and the results of operations
long b;
int B[64];
for(t=0;t<64;t++)      //Hold the next number in B[], in binary form
    B[t] = 0;

char op;

while(i < x && j < (x-1) )
{
    b = sets[i];

    makeBinaryVector(B, b);

    op = operations[j];

    OperationInA(A, op, B);

    i++; j++;
}

        //make array A a decimal number

unsigned int base = 1;
long nr = 0;
for(t=63; t>=0; t--)
{
    nr = nr + A[t] * base;
    base = base * 2;
}

return nr;
}

long sets[100];
char operations[100];
long n,i;

int main()
{


cin>>n;
for(i=0;i<n;i++)
    cin>>sets[i];

for(i=0;i<n-1;i++)
    cin>>operations[i];

cout<<setOperations(sets,operations,n);

return 0;

}

所以一切看起来都很好,除了我尝试这个的时候:

集合 = {5, 2, 1} 操作 = {'U' , '\'}

5 U 2 是 7(111),7\1 是 6 (111 - 001 = 110 --> 6) 结果应该是 6,但是当我这样输入它们时,结果是 4 (??)

但是,如果我简单地输入 {7,1} 和 {\},结果是 6,这是应该的。但是如果我像我第一次提到的那样输入它们 {5,2,1} 和 {U,} 那么它会输出 4。

我似乎无法理解或看不出我做错了什么......

最佳答案

您不必“转换为二进制数”。 没有“二进制数”这样的东西。您可以只对变量执行操作。

对于团聚,您可以使用按位OR运算符“|”,对于交集,您可以使用按位AND运算符“&”。

像这样:

if (op == 'A')
    result = a & b;
else if (op == 'U')
    result = a | b;
else if (op == '\\')
    result = a - b;
else if (op == '/')
    result = b - a;

关于c++十进制转二进制,然后用运算,再转回十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40322183/

有关c++十进制转二进制,然后用运算,再转回十进制的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  4. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  5. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  9. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby - 如何在 Ruby 中将负整数转换为二进制 - 2

    问题1:我无法通过以下方式找到将负整数转换为二进制的方法。我应该像这样转换它。-3=>"11111111111111111111111111111101"我在下面试过:sprintf('%b',-3)=>"..101"#..appearsanddoesnotshow111111bit.-3.to_s(2)=>"-11"#Thisjustadds-tothebinaryofthepositiveinteger3.问题2:有趣的是,如果我使用在线转换器,它告诉我-3的二进制是“0010110100110011”。"11111111111111111111111111111101"和"001

随机推荐