星空爱鱼C 发表于 2020-10-25 23:25:24

我不知道你们怎么算这个位运算的

这是一个转化字母大小写的小程序
Ch=getchar();
If(ch&32)
{
Ch=ch&223;//使第五位为0,变大写;
}
Else
{
Ch=ch|255;//使第五位为零变小写;
}
Putchar(ch)
















这是一个转化字母大小写的小程序
Ch=get char();
If(ch&32)
{
Ch=ch&223;//使第五位为0,变大写;
}
Else
{
Ch=ch|255;//使第五位为零变小写;
}
Put char(ch)1
//   32二进制0010 0000                  223二进制为1101 1111;                           255二进制为1111 1111;          0100   0   00   1
这是我目前为止看过小甲鱼视频怀疑人生的一次。比如我输入ch的值为A,65转化为二进制也就是0100 0001,       &   0010   0   00   0
就是先判断&语句,A&32------------------------------------------------------------------------------------------------------------------------------------------------>所以结果为0;那么就是执行else语句;

                                                                                                                                                                     000   00   00   0       

                                                                                                                                                                   0100000 1       
                                                                                                                                                              |    1111111 1       
ch|255------------------——————————————————————————————————————————————————————————>那么结果就是等于 1111 1111 ,转化一下还是255,我不知道到底怎么算他才等于97转化二进制为0110 0001;       
有哪位大哥可以说一下位运算到底是什么东西怎么算的,和数学都完全不一样;               
                                                                                                                                                                   1111   1111





















星空爱鱼C 发表于 2020-10-25 23:27:04

看了那么久的视频第一次特别头晕,脑子一盘空白;

风过无痕1989 发表于 2020-10-26 03:44:08

本帖最后由 风过无痕1989 于 2020-10-26 14:00 编辑

根据字母的二进制ASCII码值 ( 如下图------大小写二进制码 ),可以看出,第7位全为1(从右往左数),而字母的区别在于0-7位;仔细观察发现,大写的第六位全是0,而小写的第六位全是1;神奇的是, 同一字母的大写和小写除了第六位不同,其它位都相同。 所以要想改变大小写,需要对第六位的二进制做处理 ( 按位或、按位与操作 ),所以借助 ( 第六位为1的数字是32:0010 0000 ) 位运算符便可实现大小写转换 (如下图------运算原理)。

风过无痕1989 发表于 2020-10-26 11:36:57

从右至左第6位,而不是第5位

星空爱鱼C 发表于 2020-10-26 12:23:39

小甲鱼的视频if之后(判断完后执行的语句你看看上面代码)的语句是(Aa) 与223.或者是   或255,没有你说的(Aa)与或32

星空爱鱼C 发表于 2020-10-26 12:35:25

还有可以说下A|32下面数值参与运算为什么是0010 0000而A&32参与运算的数值竟然变成了1101 1111

风过无痕1989 发表于 2020-10-26 13:46:54

星空爱鱼C 发表于 2020-10-26 12:35
还有可以说下A|32下面数值参与运算为什么是0010 0000而A&32参与运算的数值竟然变成了1101 1111

看上面的图呀。我怀疑你那个程序错误,小写字母按位与(输入的字母跟 11011111,即十进制的223)才能变成大写字母,大写字母按位与位或(输入的字母跟 00100000,即十进制的32)才能变成小写字母,你的程序中正好相反

PS:昨天上传的图是 -33 看着不舒服,刚才我改过来了,改成 223,十进制 223 的二进制码和 -33 的二进制码是一样的,都是 1101 1111

风过无痕1989 发表于 2020-10-26 13:50:34

本帖最后由 风过无痕1989 于 2020-10-26 14:24 编辑

星空爱鱼C 发表于 2020-10-26 12:35
还有可以说下A|32下面数值参与运算为什么是0010 0000而A&32参与运算的数值竟然变成了1101 1111

现在的图才是对的,原来的图下边写着是 a | 32 和 a & 223,参与运算的代码却是大写字母 A 的

现在就来说按位或和按位与:

先搞清楚怎么表示按位或和按位与,我们已经知道,或的运算符是双竖杠 ||,与的运算符两个嗯n得 &&,按位或和按位与的运算符就是它们的一半,只有一个

0100   0001    <------ 大写字母A的二进制码
0010   0000    <------ 十进制数32的二进制码
---------------------------------------------------------------------
0110   0001    <------ 上下对应位按全0出0,有1出1的原则进行按位或,结果就是小写字母 a 的二进制码


0110   0001    <------ 小写字母 a 的二进制码
1101   1111    <------ 十进制数 223 的二进制码
---------------------------------------------------------------------
0100   0001    <------ 上下对应位按有0出0,全1出1的原则进行按位与,结果就是大写字母 A 的二进制码

风过无痕1989 发表于 2020-10-26 15:48:33

以下是完整的程序代码

#include <stdio.h>

void main()

{
    char ch, temp;
    printf("请输入一个字母: \n");

    ch = getchar();;
    temp = getchar();   // 接收回车键
    while( !(ch > 'A' || (ch < 'Z' && ch > 'a') || ch < 'z'))
    {
      printf("输入有误, 请重新输入一个字母: \n");
      ch = getchar();
    }
    if( ch & 32 )
    {
      ch = ch & 223; // 223 二进制码:11011111-->使第六位为0,小写变大写
    }
    else
    {
      ch = ch | 32;// 32二进制码:00100000-->使第六位为1,变小写
    }
      putchar(ch);

    printf("\n");

}

星空爱鱼C 发表于 2020-10-28 20:02:03

我也不知道你们说的对不对,不过视频是视频10年前的视频用的是v c++6.0,,我刚刚在我电脑运行了一下,发现我自己的电脑我输入一个S,他给我输出一个', ',没错就是逗号,可能是有点问题这个视频,是不是改版了之后就更新一下算法了

风过无痕1989 发表于 2020-10-28 23:09:52

星空爱鱼C 发表于 2020-10-28 20:02
我也不知道你们说的对不对,不过视频是视频10年前的视频用的是v c++6.0,,我刚刚在我电脑运行了一下,发现 ...

说实话,你题目中的那个 255 ,我还没搞懂是怎么回事
页: [1]
查看完整版本: 我不知道你们怎么算这个位运算的