鱼C论坛

 找回密码
 立即注册
查看: 1554|回复: 4

[已解决]位运算

[复制链接]
发表于 2021-10-27 16:20:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎样输入一个unsignedint类型的数n,用位运算获取其二进制形式的第1、3、5位的数值,并将第0、2、3、6位反转,输出结果。
(从右往左为第0、1、2…位;如10的二进制形式00001010;)
最佳答案
2021-10-27 17:18:43
本帖最后由 jhq999 于 2021-10-27 17:26 编辑
//都是 unsigned int 变量
a[0]=n&1;
a[1]=(n>>1)&1;
a[2]=(n>>2)&1;
a[3]=(n>>3)&1;
a[5]=(n>>5)&1;
a[6]=(n>>6)&1;

n|=0x4d;//0100 1101b  把0、2、3、6位变成1
n&=~a[0];//如果0位是1,a[0]=1,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11110b),和n按位与,那么n的0位就是0,其他不变;
               //是0,a[0]=0,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11111b),和n按位与,那么n的0位就是1,其他不变;
n&=~(a[2]<<2);//先右移到原来的位置,然后和上面一样以此类推
n&=~(a[3]<<3)
n&=~(a[6]<<6)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-27 16:33:07 | 显示全部楼层
本帖最后由 村里小黑 于 2021-10-27 16:37 编辑

第一个没太看明白,是保留那几位嘛?那样的话直接和00101010b,第二个直接异或一个01001101b就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-27 16:59:15 | 显示全部楼层
int main()
{   
    unsigned int n=122;
    printf("%d 转二进制后 分别是 %d   %d   %d  %d   %d   %d  %d \n",n,n>>6&1,n>>5&1,n>>4&1,n>>3&1,n>>2&1,n>>1 &1,n&1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-27 17:15:43 | 显示全部楼层
本帖最后由 jackz007 于 2021-10-27 19:56 编辑
#include <stdio.h>

char * foo(char s[] , unsigned int d)
{
        unsigned int i , k , m                                                      ;
        for(k = d , m = 0 ; k ; k /= 2 , m ++)                                      ;
        for(s[m] = '\0' , k = d , i = m ; k ; k /= 2 , i --) s[i - 1] = '0' + k % 2 ;
        return s                                                                    ;
}

int main(void)
{
        unsigned int n , i                                                          ;
        char s[256]                                                                 ;
        scanf("%u" , & n)                                                           ;
        printf("%s\n" , foo(s , n))                                                 ;
        printf("1 : %d\n" , (n >> 1) & 1)                                           ; /* 第1位                       */
        printf("3 : %d\n" , (n >> 3) & 1)                                           ; /* 第3位                       */
        printf("5 : %d\n" , (n >> 5) & 1)                                           ; /* 第5位                       */
        n = n ^ (1 | (1 << 2) | (1 << 3) | (1 << 6))                                ; /* 反转第0、2、3、6 位         */
        printf("%s\n" , foo(s , n))                                                 ;
        printf("%u\n" , n)                                                          ;
        n = n ^ (1 | (1 << 2) | (1 << 3) | (1 << 6))                                ; /* 复原被反转的第0、2、3、6 位 */
        printf("%s\n" , foo(s , n))                                                 ;
        printf("%u\n" , n)                                                          ;
}
        编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
87655678
101001110011000010011111110
1 : 1
3 : 1
5 : 1
101001110011000010010110011
87655603
101001110011000010011111110
87655678

D:\00.Excise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-27 17:18:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-10-27 17:26 编辑
//都是 unsigned int 变量
a[0]=n&1;
a[1]=(n>>1)&1;
a[2]=(n>>2)&1;
a[3]=(n>>3)&1;
a[5]=(n>>5)&1;
a[6]=(n>>6)&1;

n|=0x4d;//0100 1101b  把0、2、3、6位变成1
n&=~a[0];//如果0位是1,a[0]=1,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11110b),和n按位与,那么n的0位就是0,其他不变;
               //是0,a[0]=0,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11111b),和n按位与,那么n的0位就是1,其他不变;
n&=~(a[2]<<2);//先右移到原来的位置,然后和上面一样以此类推
n&=~(a[3]<<3)
n&=~(a[6]<<6)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 19:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表