Напишите программу для замены нечетных и четных битов на целое число. Какое минимальное количество шагов требуется? - PullRequest
3 голосов
/ 27 июня 2011

Я пытаюсь решить эту проблему ... и мой код выглядит следующим образом

#include<stdio.h>
int main() {
    int a, b = 0xaaaaaaaa, c = 0x55555555;
    printf("\n enter the number: \n");
    scanf("%d", & a);
    a = ((a & b) >> 1) | ((a & c) << 1);
    printf("\n %d", a);
}

.. но я получаю некоторые странные результаты .. кто-нибудь может сказать мне, какие ошибки я делаю?

Ответы [ 6 ]

11 голосов
/ 27 июня 2011

Ваша идея в порядке. Возможно, вы получаете странные выходные данные , потому что сдвиг битов работает не совсем так, как вы могли ожидать.

Ваши переменные имеют тип int. Значит - они подписаны . Теперь, когда вы делаете битовое смещение на целое число со знаком, существуют дополнительные правила о том, как распространяется бит MSB. Проще говоря, когда целое число со знаком сдвигается вправо, MSB не обязательно равен нулю, он копируется из старого значения MSB.

Попробуйте заменить int на unsigned int.

1 голос
/ 27 июня 2011

на моем компьютере этот код работал отлично, просто изменив плюс на |

#include <stdio.h>

int main() {
    int a, b = 0xaaaaaaaa, c = 0x55555555;
    printf("\n enter the number: \n");
    scanf("%d", & a);
    a = ((a & b) >> 1) | ((a & c) << 1);
    printf("\n %d\n", a);
}

ВЫХОД:

 enter the number: 
2
 1    
 enter the number: 
1
 2
0 голосов
/ 28 мая 2017

Причиной вашей проблемы является смещение вправо целого числа со знаком, где последние две цифры будут иметь 11, так как вы ИЛИ последний клев с 1010. после ИЛИ последний клев будет выглядеть как 1101.

0 голосов
/ 28 мая 2017
unsigned char
swapOddEvenBits(unsigned char num)
{
    unsigned char odd_bits = num & 0xAA;
    unsigned char even_bits = num & 0x55;

    odd_bits >>= 1;
    even_bits <<= 1;

    return (odd_bits | even_bits);
}
0 голосов
/ 26 января 2016

Хотя это решение требует больше итераций, для понятных целей попробуйте это

void swapEvenOddBits()    //function to swap the even and odd bits
{       
    unsigned int num=0,even=0,odd=0;
    scanf("%u",&num);  //enter the number

    for(int i=1; i<32; i=i+2){
        even=num&(1<<(i-1));   
        odd=num&(1<<i);     
        num=num-even-odd;   

        even=even<<1;       
        odd=odd>>1;         
        num=num+even+odd;   
        //printf("%u  %d:%d  %d:%d  \n",num,i-1,even,i,odd); //track iterations with this
    }
    printf("%u",num);  //end result
}
0 голосов
/ 16 июля 2012
import java.io.*;
public class EvenOdd {

    public static void main(String[] args) 
    {
        int b = 0xaaaaaaaa, c = 0x55555555;
        System.out.println("enter number:");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String n="";
        try {
            n = br.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int num = Integer.parseInt(n);
        num = ((num&b)>>1)|((num&c)<<1);
        System.out.println(num);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...