鱼C论坛

 找回密码
 立即注册
查看: 2245|回复: 1

[已解决]使用位运算将一个二进制数的第n位置0或置1(不能用条件语句!)

[复制链接]
发表于 2019-3-3 16:41:42 | 显示全部楼层 |阅读模式

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

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

x
要求用位运算(&,|,^,~,<<,>>)将一个二进制数的第n位置0或置1,并且不能使用任何循环(for,while等)和条件语句(if等)。
void set_bit (unsigned *x, unsigned n, unsigned v);
其中x是待修改的二进制数的指针,n是第n位(从右往左从0开始),v是0或者1,即要把第n位修改成v。

难点在于并不是单纯的取反或者是置0或者置1,可能有4种情况(把0置0,把0置1,把1置0,或者把1置1),但是又不能用条件语句分类讨论。
最佳答案
2019-3-3 16:58:10
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. uint32_t set_bit(uint32_t data, uint32_t index, uint32_t value)
  4. {
  5.         data &= ~(1 << index);
  6.         data |= (value & 0x00000001) << index;
  7.         return data;
  8. }

  9. char *get_bit_string(uint32_t data)
  10. {
  11.         static char string[33] = {0};
  12.         char *p = string;
  13.         for(uint32_t mask = 0x80000000; mask; mask >>= 1)
  14.         {
  15.                 if(mask & data)
  16.                         *p++ = '1';
  17.                 else
  18.                         *p++ = '0';
  19.         }
  20.         return string;
  21. }

  22. int main(void)
  23. {
  24.         for(uint32_t i = 0; i < 32; ++i)
  25.                 printf("%s\n", get_bit_string(set_bit(0, i, 1)));
  26.         printf("\n");
  27.         for(uint32_t i = 0; i < 32; ++i)
  28.                 printf("%s\n", get_bit_string(set_bit(0xffffffff, i, 0)));
  29.         return 0;
  30. }
复制代码

  1. 00000000000000000000000000000001
  2. 00000000000000000000000000000010
  3. 00000000000000000000000000000100
  4. 00000000000000000000000000001000
  5. 00000000000000000000000000010000
  6. 00000000000000000000000000100000
  7. 00000000000000000000000001000000
  8. 00000000000000000000000010000000
  9. 00000000000000000000000100000000
  10. 00000000000000000000001000000000
  11. 00000000000000000000010000000000
  12. 00000000000000000000100000000000
  13. 00000000000000000001000000000000
  14. 00000000000000000010000000000000
  15. 00000000000000000100000000000000
  16. 00000000000000001000000000000000
  17. 00000000000000010000000000000000
  18. 00000000000000100000000000000000
  19. 00000000000001000000000000000000
  20. 00000000000010000000000000000000
  21. 00000000000100000000000000000000
  22. 00000000001000000000000000000000
  23. 00000000010000000000000000000000
  24. 00000000100000000000000000000000
  25. 00000001000000000000000000000000
  26. 00000010000000000000000000000000
  27. 00000100000000000000000000000000
  28. 00001000000000000000000000000000
  29. 00010000000000000000000000000000
  30. 00100000000000000000000000000000
  31. 01000000000000000000000000000000
  32. 10000000000000000000000000000000

  33. 11111111111111111111111111111110
  34. 11111111111111111111111111111101
  35. 11111111111111111111111111111011
  36. 11111111111111111111111111110111
  37. 11111111111111111111111111101111
  38. 11111111111111111111111111011111
  39. 11111111111111111111111110111111
  40. 11111111111111111111111101111111
  41. 11111111111111111111111011111111
  42. 11111111111111111111110111111111
  43. 11111111111111111111101111111111
  44. 11111111111111111111011111111111
  45. 11111111111111111110111111111111
  46. 11111111111111111101111111111111
  47. 11111111111111111011111111111111
  48. 11111111111111110111111111111111
  49. 11111111111111101111111111111111
  50. 11111111111111011111111111111111
  51. 11111111111110111111111111111111
  52. 11111111111101111111111111111111
  53. 11111111111011111111111111111111
  54. 11111111110111111111111111111111
  55. 11111111101111111111111111111111
  56. 11111111011111111111111111111111
  57. 11111110111111111111111111111111
  58. 11111101111111111111111111111111
  59. 11111011111111111111111111111111
  60. 11110111111111111111111111111111
  61. 11101111111111111111111111111111
  62. 11011111111111111111111111111111
  63. 10111111111111111111111111111111
  64. 01111111111111111111111111111111
  65. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-3 16:58:10 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. uint32_t set_bit(uint32_t data, uint32_t index, uint32_t value)
  4. {
  5.         data &= ~(1 << index);
  6.         data |= (value & 0x00000001) << index;
  7.         return data;
  8. }

  9. char *get_bit_string(uint32_t data)
  10. {
  11.         static char string[33] = {0};
  12.         char *p = string;
  13.         for(uint32_t mask = 0x80000000; mask; mask >>= 1)
  14.         {
  15.                 if(mask & data)
  16.                         *p++ = '1';
  17.                 else
  18.                         *p++ = '0';
  19.         }
  20.         return string;
  21. }

  22. int main(void)
  23. {
  24.         for(uint32_t i = 0; i < 32; ++i)
  25.                 printf("%s\n", get_bit_string(set_bit(0, i, 1)));
  26.         printf("\n");
  27.         for(uint32_t i = 0; i < 32; ++i)
  28.                 printf("%s\n", get_bit_string(set_bit(0xffffffff, i, 0)));
  29.         return 0;
  30. }
复制代码

  1. 00000000000000000000000000000001
  2. 00000000000000000000000000000010
  3. 00000000000000000000000000000100
  4. 00000000000000000000000000001000
  5. 00000000000000000000000000010000
  6. 00000000000000000000000000100000
  7. 00000000000000000000000001000000
  8. 00000000000000000000000010000000
  9. 00000000000000000000000100000000
  10. 00000000000000000000001000000000
  11. 00000000000000000000010000000000
  12. 00000000000000000000100000000000
  13. 00000000000000000001000000000000
  14. 00000000000000000010000000000000
  15. 00000000000000000100000000000000
  16. 00000000000000001000000000000000
  17. 00000000000000010000000000000000
  18. 00000000000000100000000000000000
  19. 00000000000001000000000000000000
  20. 00000000000010000000000000000000
  21. 00000000000100000000000000000000
  22. 00000000001000000000000000000000
  23. 00000000010000000000000000000000
  24. 00000000100000000000000000000000
  25. 00000001000000000000000000000000
  26. 00000010000000000000000000000000
  27. 00000100000000000000000000000000
  28. 00001000000000000000000000000000
  29. 00010000000000000000000000000000
  30. 00100000000000000000000000000000
  31. 01000000000000000000000000000000
  32. 10000000000000000000000000000000

  33. 11111111111111111111111111111110
  34. 11111111111111111111111111111101
  35. 11111111111111111111111111111011
  36. 11111111111111111111111111110111
  37. 11111111111111111111111111101111
  38. 11111111111111111111111111011111
  39. 11111111111111111111111110111111
  40. 11111111111111111111111101111111
  41. 11111111111111111111111011111111
  42. 11111111111111111111110111111111
  43. 11111111111111111111101111111111
  44. 11111111111111111111011111111111
  45. 11111111111111111110111111111111
  46. 11111111111111111101111111111111
  47. 11111111111111111011111111111111
  48. 11111111111111110111111111111111
  49. 11111111111111101111111111111111
  50. 11111111111111011111111111111111
  51. 11111111111110111111111111111111
  52. 11111111111101111111111111111111
  53. 11111111111011111111111111111111
  54. 11111111110111111111111111111111
  55. 11111111101111111111111111111111
  56. 11111111011111111111111111111111
  57. 11111110111111111111111111111111
  58. 11111101111111111111111111111111
  59. 11111011111111111111111111111111
  60. 11110111111111111111111111111111
  61. 11101111111111111111111111111111
  62. 11011111111111111111111111111111
  63. 10111111111111111111111111111111
  64. 01111111111111111111111111111111
  65. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 07:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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