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);
}