麦当和笛亚 发表于 2021-10-27 16:20:47

位运算

怎样输入一个unsignedint类型的数n,用位运算获取其二进制形式的第1、3、5位的数值,并将第0、2、3、6位反转,输出结果。
(从右往左为第0、1、2…位;如10的二进制形式00001010;)

村里小黑 发表于 2021-10-27 16:33:07

本帖最后由 村里小黑 于 2021-10-27 16:37 编辑

第一个没太看明白,是保留那几位嘛?那样的话直接和00101010b,第二个直接异或一个01001101b就好了

wp231957 发表于 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;
}

jackz007 发表于 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 = '\0' , k = d , i = m ; k ; k /= 2 , i --) s = '0' + k % 2 ;
      return s                                                                  ;
}

int main(void)
{
      unsigned int n , i                                                          ;
      char s                                                               ;
      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>

jhq999 发表于 2021-10-27 17:18:43

本帖最后由 jhq999 于 2021-10-27 17:26 编辑


//都是 unsigned int 变量
a=n&1;
a=(n>>1)&1;
a=(n>>2)&1;
a=(n>>3)&1;
a=(n>>5)&1;
a=(n>>6)&1;

n|=0x4d;//0100 1101b把0、2、3、6位变成1
n&=~a;//如果0位是1,a=1,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11110b),和n按位与,那么n的0位就是0,其他不变;
               //是0,a=0,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11111b),和n按位与,那么n的0位就是1,其他不变;
n&=~(a<<2);//先右移到原来的位置,然后和上面一样以此类推
n&=~(a<<3)
n&=~(a<<6)
页: [1]
查看完整版本: 位运算