为什么使用low + (high - low) / 2而不使用(high + low) / 2呢?

为什么使用low + (high - low) / 2而不使用(high + low) / 2呢?目的是防止溢出!
为什么这样就防止溢出了呢?看下面的例子。

high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
 low = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824

然后我们将这两个数值相加,看结果是什么。

high + low =  1000 0000 0000 0000 0000 0000 0000 0000
           =  2147483648 as unsigned 32-bit integer
           = -2147483648 as signed   32-bit integer
	(high + low) / 2   = 1100 0000 0000 0000 0000 0000 0000 0000 = -1073741824
	(high + low) >>> 1 = 0100 0000 0000 0000 0000 0000 0000 0000 =  1073741824
low + (high - low) / 2 = 0100 0000 0000 0000 0000 0000 0000 0000 =  1073741824

作为带符号的32位整数,它是溢出的并且翻转为负。因此(high + low) / 2是错误的,因为high + low的运算结果可能超出当前类型所表示的范围的。

如果作为无符号32位整数运算,总和是正确的。所需要的就是将它除以2。

在Java运算中不支持无符号整数,所以我们一般选择low + (high - low) / 2来防止溢出,但有一种是这样写的low + (high - low) >>> 1,在Java中>>>和>>的区别,则在于无符号和有符号。如果使用>>,会将符号位也参与运算。

(high + low) >> 1 = 1100 0000 0000 0000 0000 0000 0000 0000 = -1073741824

一般来说>>和>>>比除法的/的运行效率高,但是经过编译器的优化,他们效率并不相差多少,工作中尽量风格和同事统一,不要擅自使用位运算,这样有可能会造成阅读困难,而且效率也不能提高多少。
如果文中我的理解有偏差或者错误,请阅读者评论指出,不胜感激。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码的作用是加载训练和验证数据的文件路径,并对文件路径进行排序。然后,它使用断言语句来确保训练低分辨率图像数据的列表 `train_low_data_names` 和训练高分辨率图像数据的列表 `train_high_data_names` 长度相等且不为零。 逐句解释这段代码: 1. `train_data_path = os.path.join(data_dir, 'train')`:将训练数据文件夹路径与 'train' 目录拼接,得到训练数据集的完整路径。 2. `valid_data_path = os.path.join(data_dir, 'val')`:将验证数据文件夹路径与 'val' 目录拼接,得到验证数据集的完整路径。 3. `train_low_data_names = glob(train_data_path + '/low/*.png')`:使用 `glob` 函数查找训练低分辨率图像数据文件夹中所有以 '.png' 扩展名结尾的文件,并将它们的路径存储在 `train_low_data_names` 列表中。 4. `train_low_data_names.sort()`:对训练低分辨率图像数据的列表进行排序,以确保它们按照字母顺序排列。 5. `train_high_data_names = glob(train_data_path + '/high/*.png')`:使用 `glob` 函数查找训练高分辨率图像数据文件夹中所有以 '.png' 扩展名结尾的文件,并将它们的路径存储在 `train_high_data_names` 列表中。 6. `train_high_data_names.sort()`:对训练高分辨率图像数据的列表进行排序,以确保它们按照字母顺序排列。 7. `eval_low_data_names = glob(valid_data_path + '/low/*.*')`:使用 `glob` 函数查找验证低分辨率图像数据文件夹中的所有文件,并将它们的路径存储在 `eval_low_data_names` 列表中。 8. `eval_low_data_names.sort()`:对验证低分辨率图像数据的列表进行排序,以确保它们按照字母顺序排列。 9. `eval_high_data_names = glob(valid_data_path + '/high/*.*')`:使用 `glob` 函数查找验证高分辨率图像数据文件夹中的所有文件,并将它们的路径存储在 `eval_high_data_names` 列表中。 10. `eval_high_data_names.sort()`:对验证高分辨率图像数据的列表进行排序,以确保它们按照字母顺序排列。 11. `assert len(train_low_data_names) == len(train_high_data_names)`:断言训练低分辨率图像数据的列表 `train_low_data_names` 和训练高分辨率图像数据的列表 `train_high_data_names` 的长度相等。 12. `assert len(train_low_data_names) != 0`:断言训练低分辨率图像数据的列表 `train_low_data_names` 的长度不为零。 这些断言语句用于确保数据加载的正确性和一致性。如果断言条件不满足,将会引发 `AssertionError` 异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值