Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 写一个程序来交换整数中的奇偶位所需的最小步数是多少?_C - Fatal编程技术网

C 写一个程序来交换整数中的奇偶位所需的最小步数是多少?

C 写一个程序来交换整数中的奇偶位所需的最小步数是多少?,c,C,我正在尝试解决这个问题,我的代码如下 #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); }

我正在尝试解决这个问题,我的代码如下

#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);
}
#包括
int main(){
int a,b=0xaaaaaa,c=0x5555;
printf(“\n输入数字:\n”);
scanf(“%d”和“&a”);
你的想法没问题。
也许你得到的是奇怪的输出,因为比特移位并不像你想象的那样工作

您的变量类型为
int
。意思是-它们是有符号的。现在,当您将位移位到有符号整数时,会有关于MSB位传播方式的附加规则。简单地说,当有符号整数向右移位时,MSB不一定为零,而是从旧的MSB值复制而来


在我的电脑上,尝试用
无符号int
替换
int

此代码工作正常 刚把加号改成|

#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);
}
import java.io.*;
公共课偶数{
公共静态void main(字符串[]args)
{
int b=0xaaaaaa,c=0x555555;
System.out.println(“输入编号:”);
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
字符串n=“”;
试一试{
n=br.readLine();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
int num=Integer.parseInt(n);

num=((num&b)>>1)|((num&c)虽然此解决方案需要更多的迭代,但为了便于理解,请尝试以下方法

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
}
void swapEvenOddBits()//用于交换偶数位和奇数位的函数
{       
无符号整数num=0,偶数=0,奇数=0;
scanf(“%u”,&num);//输入数字
对于(int i=1;i
无符号字符
swapOddEvenBits(无符号字符数)
{
无符号字符奇数_位=num&0xAA;
无符号字符偶数位=num&0x55;
奇数位>>=1;

您的问题的原因是有符号整数的右移,当您用1010或最后一个半字节时,最后两位数字将有11。之后或最后一个半字节看起来像1101。

无论我输入什么数字,我都会得到one@learning_bee:这不是我运行代码时的行为。(参见示例)@learning_bee:如果你打算将+改为| not | | |。但是+在这种特殊情况下由于数据模式而起作用。@grok12:你能详细说明一下为什么会起作用以及“特殊情况”是什么吗?@grok12-i改变了这一点,并看到输出是相同的1#include int main(){unsigned int a;int b=0xaaaaaa,c=0x55555555;printf(“\n请输入数字:\n”);scanf(“%d”,&a);a=((a&b)>>1)|((a&c)>算术移位是否符合标准?我认为逻辑移位更适用于有符号整数,
对负值有实现定义的行为。不要对有符号类型使用位移位。按照瓦尔多说的做,并将类型更改为
unsigned
您的代码将正常工作。
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);
    }
}
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
}
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);
}